基本动态内存分配和删除触发断言失败
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
中通过副本传递它时),临时不能delete
d.
这是具体的,即使您通过引用传递它 (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 我建议避免拥有裸指针。
我正在复习 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
中通过副本传递它时),临时不能delete
d.
这是具体的,即使您通过引用传递它 (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 我建议避免拥有裸指针。