//方案1
int *ip = new int(42);
int *alpha = new int(10);
shared_ptr<int>q1 (alpha);
shared_ptr<int> p1(ip);
p1 = q1; //将引用计数置为0
cout <<"ip(释放后):" <<*ip << endl; //可以输出
//方案2
int *test1 = new int(4);
delete(test1);
cout << *test1 << endl; //提示内存错误,读取位置发生访问冲突
//方案3
int a=10;
int *test2=&a;
delete(test2);
cout<< *test2<< endl; //提示_BLOCK_TYPE_IS_VALID(pHead->nBlockUse)
请问这是为什么?
delete和智能指针释放内存的机制有什么区别?
方案2和方案3有什么区别?为什么错误不一样呢?
shared_ptr もデフォルトで delete を呼び出すため、理論的には削除メカニズムと違いはありません
削除後の再アクセスの動作は不確実です。たとえば、メモリが他の人によって使用されていない場合、アクセスは元の値を保持するか、または元の値になります。 0; 他の人が使用すると、何かが起こります。これはいわゆるワイルド ポインタです。したがって、ここでの share_ptr と delete の動作が異なるのは正常です。複数回実行して結果を確認できます。
プラン 2 の A はヒープ上に割り当てられ、プラン 3 はスタック上に割り当てられます。削除はヒープ上のメモリ (または新規からのメモリ) を解放するためにのみ使用でき、メモリを解放することはできません。スタック上にあるため、_BLOCK_TYPE_IS_VALID エラーが報告されます。スタック上のメモリは、関数が終了するとシステムによって自動的に解放されます