在下面的代码中:
class Test{
public:
std::vector<int> *num;
int *n;
};
Test *t = new Test();
t->num = new std::vector<int>;
t->num->assign(10,10);
t->n = new int[20];
t->n[0] = 12345;
int *testN = t->n;
std::vector<int> *testV;
testV = t->num;
delete t;
//I can print n's memory
printf("%d\n", testN[0]); //get 12345, so memory leaked here.
//I can't print num's memory; its size is 0. in release version, it's negative number.
printf("%d\n", testV->size());
删除t之后,我看到内存num指向清除,在我的VS10环境中,我可以看到它的内存被清理为'ee fe ee fe ....'。 但是n的记忆保持不变。
在我看来,所有内存都来自关键字new,应该通过删除释放,好吧,这里的num(vector)是 不是'删除,而是自动清除。
我想知道矢量指针与其他指针有什么不同?
答案 0 :(得分:3)
仅释放t
个内存,成员num
和n
指向的是内存泄漏。
您的测试是错误的,因为您在删除它之后无法检查t
,并且没有其他方法可以访问这些成员(错误地泄漏)。
答案 1 :(得分:2)
调试运行时将使用eefe之类的标记覆盖它删除的内存,以检测像free-after-free之类的错误。发布版本不会这样做。
您可能只是误读了调试输出。 vector *和int *内存仍然存在。调试器可能只是试图更聪明地使用矢量。
答案 2 :(得分:1)
如果您想要正确执行此操作,则需要delete [] t->n;
和delete t->num;
才能执行delete t;
- 但更正确的方法是“正确”使用面向对象,让t
的构造函数和析构函数处理内存分配并释放n
和num
- 自动地,为类本身正确管理内存。
我还要指出,使用指向std::vector
的指针很少是正确的 - 向量本身不会占用那么多空间,因此您可能应该使用std::vector<int> num;
而不是指针它。这也意味着在析构函数中自动销毁num
,而无需任何额外的代码。