基本动态内存分配和删除触发关联失败 我正在复习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,他可以随意删除它。