在c ++中双删除两个已分配的变量

时间:2014-08-01 14:54:44

标签: c++

我收到了这段代码:

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;也?

5 个答案:

答案 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指向的对象。 ab仍将具有原始对象的地址值。为确保ab未被正确使用,请尝试添加以下内容:

a=NULL;
b=NULL;