内存管理指针
Memory management pointers
我看到了一种常见的做法,即删除指针amd,使其在析构函数中为空,即使没有为堆上的指针分配内存。请考虑以下C++代码:
哑巴.h
class dummy
{
int* a;
}
假人.cpp
dummy::dummy():a(NULL)
{ cout<<Inside Const"; }
dummy::~dummy()
{
if(a!=NULL)
{
delete a;
a = NULL;
}
}
bool func()
{
a = func1();
}
在上面的代码中,虽然内存没有分配给堆,但即使这样它也会被删除。它不应该导致内存泄漏吗?
让它为空是完全没有意义的,因为它即将被摧毁。
如果代码为 null,则您的代码不会删除它,因为if (a!=NULL)
.但是,这也是毫无意义的:将 delete
应用于 null 指针将什么都不做,因此您可以将析构函数简化为无条件delete a;
(假设您知道它要么为 null,要么指向使用 new
创建的对象)。
根据三法则,您确实需要确保您的类不可复制或具有有效的复制语义;否则,复制对象将导致删除相同的内存两次,这是不允许的。
更好的是,停止杂耍指针,并使用智能指针,容器和其他RAII类型,使生活更加简单。
您永远不应该在指向不是堆分配对象的对象的指针上调用 delete。 如果这样做,程序可能会忽略该行。 或者它可能会擦除您的硬盘驱动器。 或者它可能会忽略您计算机上的该行,并且在您将程序交给朋友后,它会擦除他们的硬盘驱动器。 别这样。
相关:您的类缺少复制构造函数和复制赋值,当您有一个管理内存的指针时,这是至关重要的。 或者,将int*
杆件替换为unique_ptr<int>
杆件,该杆件为您管理构造和移动。
相关文章:
- 使用"Task"函数指针队列定义作业管理器
- 向量成员在管理类指针C++队列时丢失
- 函数指针和 lambda 的内存管理
- 如何将指针从unique_ptr传递到另一个对象并管理寿命
- 哪些资源是由智能指针管理的,而它们的内存不是由new分配的
- 底层指针和内存管理
- 坚持将双指针管理的内存复制到二维数组
- 智能指针,避免使用QNetworkAccessManager时进行手动内存管理
- 循环和内存管理中的指针算术C++?
- 可以通过非原始指针来增强容器矢量管理内存
- 管理到本机值类转换:强制转换指针是否安全?
- 指针的一系列指针:管理不同语言的字符串
- C 11 / 14-是否有针对其他地方管理的资源的原始指针包装器
- 编写安全包装类以管理用户定义对象的指针
- C++ |方法范围指针管理
- 如何在将指针传递给库函数时处理内存管理
- C++管理单一实例中的堆/指针
- 学生成绩管理系统 在C++中,表达式必须具有指向对象类型的指针
- 使用智能指针管理函数内分配的内存
- 原始指针管理