C++:当我删除由 new 创建的指针时出现内存问题
C++: memory issue when I delete a pointer created by new
我对下面的代码有点困惑
int main()
{
int* a = new int{12};
int* b = new int;
b = a;
delete a;
delete b;
return 0;
}
代码returns出错
a.out(27538,0x10ade7e00) malloc: *** error for object 0x7f8c18504160: pointer being freed was not allocated
a.out(27538,0x10ade7e00) malloc: *** set a breakpoint in malloc_error_break to debug
zsh: abort ./a.out
我的问题是,当我删除a时,它会自动删除b吗?这是什么机制,有点迷路了
b = a; // here the int that b pointed at "leaks" (you have no way of deleting it)
delete a; // here "a" is deleted first
delete b; // here "a" is deleted a second time (undefined behavior)
当您将 a
的值分配给 b
时,b
之前包含的值(地址,如果您愿意)将被遗忘。 a
和 b
然后都指向同一个对象。然后,您失去了 delete
原始对象 b
指向的所有可能性。当你然后 delete b
你实际上尝试删除 a
第二次。
当你删除一个指针时,所有指向被销毁对象的指针、引用、迭代器等都将失效。因为赋值b = a
,b和a指向同一个对象,所以当a被删除后,b就失效了。删除无效指针具有未定义的行为。
请注意,b = a
使得无法删除 b 先前指向的分配。这称为内存泄漏。
让我们逐行浏览代码。
int* a = new int{12};
这将创建一个名为 a
且类型为 int*
的新变量,并将其初始化为指向一个新分配的整数,赋值为 12。
int* b = new int;
这将创建一个名为 b
的 int*
类型的新变量,并将其初始化为指向新分配的整数。
b = a;
这会将 b
的值更改为指向 a
。第二次调用 new
时返回的值现在丢失了,并且由于不再可能将其传递给 delete
.
而导致内存泄漏
delete a;
这将删除 a
指向的对象,第一个分配的对象。
delete b;
糟糕,这试图删除 b
指向的对象,但 b
没有指向任何当前存在的对象。第一个分配的刚刚被删除,不存在指向第二个的指针。所以这是一个错误。
我怀疑您认为 delete a;
删除了 a
。它不是。它删除 a
指向的任何对象,并要求 a
是一个指针并指向使用 new
.
分配的有效对象
我对下面的代码有点困惑
int main()
{
int* a = new int{12};
int* b = new int;
b = a;
delete a;
delete b;
return 0;
}
代码returns出错
a.out(27538,0x10ade7e00) malloc: *** error for object 0x7f8c18504160: pointer being freed was not allocated
a.out(27538,0x10ade7e00) malloc: *** set a breakpoint in malloc_error_break to debug
zsh: abort ./a.out
我的问题是,当我删除a时,它会自动删除b吗?这是什么机制,有点迷路了
b = a; // here the int that b pointed at "leaks" (you have no way of deleting it)
delete a; // here "a" is deleted first
delete b; // here "a" is deleted a second time (undefined behavior)
当您将 a
的值分配给 b
时,b
之前包含的值(地址,如果您愿意)将被遗忘。 a
和 b
然后都指向同一个对象。然后,您失去了 delete
原始对象 b
指向的所有可能性。当你然后 delete b
你实际上尝试删除 a
第二次。
当你删除一个指针时,所有指向被销毁对象的指针、引用、迭代器等都将失效。因为赋值b = a
,b和a指向同一个对象,所以当a被删除后,b就失效了。删除无效指针具有未定义的行为。
请注意,b = a
使得无法删除 b 先前指向的分配。这称为内存泄漏。
让我们逐行浏览代码。
int* a = new int{12};
这将创建一个名为 a
且类型为 int*
的新变量,并将其初始化为指向一个新分配的整数,赋值为 12。
int* b = new int;
这将创建一个名为 b
的 int*
类型的新变量,并将其初始化为指向新分配的整数。
b = a;
这会将 b
的值更改为指向 a
。第二次调用 new
时返回的值现在丢失了,并且由于不再可能将其传递给 delete
.
delete a;
这将删除 a
指向的对象,第一个分配的对象。
delete b;
糟糕,这试图删除 b
指向的对象,但 b
没有指向任何当前存在的对象。第一个分配的刚刚被删除,不存在指向第二个的指针。所以这是一个错误。
我怀疑您认为 delete a;
删除了 a
。它不是。它删除 a
指向的任何对象,并要求 a
是一个指针并指向使用 new
.