【发布时间】:2014-12-25 23:51:30
【问题描述】:
我已经在互联网上搜索了几个小时,并想出了这些步骤来防止内存泄漏(不使用智能指针和高级工具等)。如果以下发现有任何问题,请告诉我...提前致谢。
- 每一个新的都应该有一个删除。
- 如果 new 在类中,则将 delete 放入析构函数中会处理动态分配的内存。
- 如果您在 main 中从类 foo 中创建一个新对象 obj,那么您将不得不显式删除 obj。
- 如果您有多维动态数组,则必须删除这两个级别。 (我有点不确定这是否安全......我认为只有一次删除 ptr 可能会做到这一点,但经过仔细考虑后,我认为它是一个动态数组的动态数组,应该将每个动态数组分别视为一个动态数组)。
前 1 个。
char *ptr;
ptr = new char[size];
// Some Code here
delete ptr;
前 2.
//foo.h
class foo {
private:
char * ptr;
public
foo();
~foo();
};
// foo.cpp
foo::foo()
{
ptr = new char[100];
for (int i = 0; i < 100; i++)
ptr[i] = i;
}
foo::~foo()
{
delete ptr;
}
前 3.
//main.cpp foo class stays the same as ex 2.
int main()
{
foo obj = new foo();
// Some code here
delete obj;
return 0;
}
前 4.
//foo.h
class foo {
private:
char ** ptr;
public
foo();
~foo();
};
//foo.cpp
foo::foo()
{
ptr = new char[100];
for (int i = 0; i < 100; i++)
ptr[i] = new char[100];
for (int i = 0; i < 100; i++)
for (int j = 0; j < 100; j++)
ptr[i][j] = i;
}
foo::~foo()
{
for (int i = 0; i < 100; i++)
delete ptr[i];
delete ptr;
}
【问题讨论】:
-
在 ex1 中,您必须调用
delete[] ptr,因为它是char的数组,请看这里:cplusplus.com/reference/new/operator%20delete%5B%5D ex2 上的相同问题,在析构函数中添加[]。 Ex3 没问题。对于 Ex4,在析构函数中为delete添加相同的[]。希望对您有所帮助! -
这个问题似乎离题了,这里没有真正的问题,你只是想让我们回顾你的例子。因此,您应该将其发布到 codereview.stackexchange.com。
-
5. 如果您在
new时使用[],则必须 在delete时使用[]`。 例如。 5o = new Object; delete o;与array = new char[100];删除[] 数组;`. -
智能指针和向量等比手动管理内存要少得多。我不会称其为高级。向量在大多数情况下可以像数组一样使用,智能指针在大多数情况下可以像指针一样使用。
-
你的策略中有一个明显的遗漏:深拷贝。例如,在你的前 2 和 4 中,你需要实现深拷贝(并且也移动),否则,你的对象的意外拷贝会导致内存的双重删除(这通常会导致堆损坏,这真的很糟糕!)。见the Big Five。
标签: c++ pointers memory-leaks dynamic-memory-allocation