基本动态内存分配和删除触发断言失败

Basic dynamic memory allocation and delete triggers an asssertion failed

我正在复习 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);
}

我触发的断言失败总是不同的,这让我认为 p 的删除正在访问一些未知的内存槽。 当我删除 delete p;p = &a; 时,一切正常。

在我看来,我不应该删除 p 并且它将在范围末尾删除,但它是动态分配,不应该是这种情况...

我在这里错过了什么?

在这个表达式中

int* p = new int;

您正在向 p 分配由 new 分配的内存块。

在这个表达式中

p = &a; 

你正在分配给 p 临时地址,原始变量 a 的副本(当你在 fonctionPointeur 中通过副本传递它时),临时不能deleted.

这是具体的,即使您通过引用传递它 (void fonctionPointeur(int &a)) 问题仍然存在,您也不能 delete 它不是动态分配的。

此外,由于 p 现在指向 a,您无法访问之前分配的内存,您不能再 delete 它,这是内存泄漏。

It seems to me that I'm not supposed to delete p

这是否正确取决于您指的是哪个值:

int* p = new int;

这是您为 p 提供的第一个值。您必须删除 new int 的结果,否则内存泄漏。

p = &a;

在这里,您为 p 分配一个新值,覆盖旧值。你不能删除 &a 的结果,因为它是一个指向具有自动存储的对象的指针。如果你确实删除了它,那么程序的行为是未定义的。

您必须在覆盖值之前删除 p,因为之前的值将会丢失。否则,由于这是指针的唯一副本,因此覆盖该值会导致内存泄漏。

and that it will be delete at the end of the scope,

a p 指向的

a 会自动销毁,并释放其自动存储。

p 指向的动态对象不会被自动销毁,其动态存储也不会被释放。


P.S。动态分配 int 几乎没有用。我建议避免不必要的动态分配。

P.P.S 我建议避免拥有裸指针。