基本动态内存分配和删除触发关联失败 我正在复习C++的基础知识,我有一些问题理解为什么我的代码触发断言。 void fonctionPointeur(int a) { int* p = new int; p = &a; std::cout << p << "----" << *p << std::endl; delete p; } int main() { std::cout << "Hello World!" << std::endl; int a = 6; fonctionPointeur(a); } void fonctionPointeur(int a) { int*p=新的int; p=&a; 在这个表达式中std::cout
基本动态内存分配和删除触发关联失败 我正在复习C++的基础知识,我有一些问题理解为什么我的代码触发断言。 void fonctionPointeur(int a) { int* p = new int; p = &a; std::cout << p << "----" << *p << std::endl; delete p; } int main() { std::cout << "Hello World!" << std::endl; int a = 6; fonctionPointeur(a); } void fonctionPointeur(int a) { int*p=新的int; p=&a; 在这个表达式中std::cout,c++,memory-management,dynamic,C++,Memory Management,Dynamic,int* p = new int; p = &a; 您正在为p分配由new分配的内存块 在这个表达式中 int* p = new int; p = &a; 您正在向p分配一个临时变量的地址,即原始变量a的副本(当您在fonctionPointeur中通过副本传递它时),该临时变量不能删除d 具体来说,即使您通过引用传递它(void fonctionPointeur(int&a)),问题仍然存在,您也不能删除它,因为它不是动态分配的 此外,由于p现在指向a,您失去了对先
int* p = new int;
p = &a;
您正在为p
分配由new
分配的内存块
在这个表达式中
int* p = new int;
p = &a;
您正在向p
分配一个临时变量的地址,即原始变量a
的副本(当您在fonctionPointeur
中通过副本传递它时),该临时变量不能删除
d
具体来说,即使您通过引用传递它(void fonctionPointeur(int&a)
),问题仍然存在,您也不能删除它,因为它不是动态分配的
此外,由于p
现在指向a
,您失去了对先前分配的内存的访问,您无法再删除它,这是内存泄漏
在我看来,我不应该删除p
这是正确的还是不正确的取决于您所引用的值:
这是为p
指定的第一个值。必须删除new int
的结果,否则内存泄漏
在这里,您为p
指定了一个新值,覆盖了旧值。您不能删除&a
的结果,因为它是指向具有自动存储的对象的指针。如果您删除了它,则程序的行为是未定义的
您必须在覆盖该值之前删除p
,因为以前的值将丢失。否则,由于这是指针的唯一副本,因此覆盖该值会导致内存泄漏
并将在范围结束时删除
a
指向的p
将被自动销毁,其自动存储将被解除分配
用于指向的p
动态对象不会自动销毁,其动态存储也不会解除分配
另外,动态分配int
几乎没有任何用处。我建议避免不必要的动态分配
p.p.S我建议避免拥有裸指针。问问自己:p=&a;
对指针做了什么?它仍然指向您用new创建的相同内存吗?感谢您的澄清!我写int*p=new int(6);相反,内存所有者只是指针p,他可以随意删除它。