我收到了这段代码:
int **a;
int *b;
b = new int;
a = new int*;
*b=10;
a =&b;
std::cout << **a << std::endl;// display 10
如果我这样做:
delete a;
我是否删除&#34; b&#34;也?
答案 0 :(得分:5)
delete a;
由于a
未分配new
,因此会导致未定义的行为。
当您第二次分配到a
时,问题才真正开始。
b = new int;
a = new int*;
*b = 10;
a = &b; // oops
此时您已经忘记了最初存储在new
中的a
原始来电分配的对象。这就是内存泄漏。
您的代码应该如下所示:
int *b = new int;
*b = 10;
int **a = &b;
std::cout << **a << std::endl;
delete b;
答案 1 :(得分:4)
如果您执行delete a
,则会在宇宙结构中撕裂一个洞,因为a
不再指向new int*
,而是b
,而不是{{1}}动态分配。
答案 2 :(得分:0)
b是动态分配的(b = new int;) 然后我们将10存储到已分配的int。
然后我们分配&#39; a&#39;指向int的指针。 但是然后分配到&#39; a&#39;这意味着我们失去了什么&#39; a&#39;指着。 当我们删除一个时,我猜你会因为它不再指向而收到错误 在动态分配的内存。
也许你的意思是* a = b
在这种情况下,你仍然需要删除a并删除b
答案 3 :(得分:0)
改述你的问题和代码:
int * b = new int; // Dynamically allocate for 1 integer.
int * * a = new int *; // Allocate 1 pointer dynamically.
// The tricky part to understand.
// The variable `a` points to a pointer.
// So dereferencing 'a' results in a pointer to an integer.
// So, assign the pointer, in dynamic memory, with the content
// of the 'b' pointer.
*a = b;
// What does this statement do?
delete a;
在上面的示例中,delete
释放了为a
变量分配的内存。没有更多,没有更少。
指针b
不受影响。它仍然指向为整数分配的内存。
a
的内存释放不会影响b
,因为解除分配功能不会对分配的内存内容进行操作。
答案 4 :(得分:-3)
是。好吧,它会删除b
指向的对象。 a
和b
仍将具有原始对象的地址值。为确保a
和b
未被正确使用,请尝试添加以下内容:
a=NULL;
b=NULL;