C++ 为什么向量指针';内存自动清除
BS:我已经测试过了,下面的问题是针对VS2010的,在我对Mingw的测试中,向量内存是泄漏的 printf(“%d\n”,testV->size()); 给了我“10”,这表明这是个漏洞 在如下代码中:C++ 为什么向量指针';内存自动清除,c++,pointers,vector,C++,Pointers,Vector,BS:我已经测试过了,下面的问题是针对VS2010的,在我对Mingw的测试中,向量内存是泄漏的 printf(“%d\n”,testV->size()); 给了我“10”,这表明这是个漏洞 在如下代码中: class Test{ public: std::vector<int> *num; int *n; }; Test *t = new Test(); t->num = new std::vector<int>; t->num->a
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());
类测试{
公众:
std::vector*num;
int*n;
};
测试*t=新测试();
t->num=新标准::向量;
t->num->assign(10,10);
t->n=新整数[20];
t->n[0]=12345;
int*testN=t->n;
std::vector*testV;
testV=t->num;
删除t;
//我可以打印n的记忆
printf(“%d\n”,testN[0])//获取12345,所以内存在这里泄漏。
//我无法打印num的内存;它的大小是0。在发行版中,它是负数。
printf(“%d\n”,testV->size());
删除t后,我看到指向的内存num被清除,在我的VS10环境中,我可以看到它的内存被清除为“ee-fe-ee-fe…”。
但是n的记忆保持不变
在我看来,所有的内存都来自关键字new,应该通过delete释放,这里是num(vector)
不是“删除”,而是自动清除
我想知道向量指针与其他指针有何不同?只有
t
的内存被释放,成员num
和n
指向的是内存泄漏
您的测试是错误的,因为删除后您无法检查
t
,并且没有其他方法访问这些成员(因此泄漏)。只有t
的内存被释放,成员num
和n
指向的是泄漏的内存
您的测试是错误的,因为删除后无法检查
t
,并且没有其他方法访问这些成员(因此泄漏)。调试运行时将使用eefe等标记覆盖它删除的内存,以检测释放后使用等错误。发布版本无法做到这一点
您可能只是误读了调试输出。向量*和int*内存仍然存在。调试器可能只是在尝试更智能地处理向量。调试运行时将使用诸如eefe之类的标记覆盖它删除的内存,以检测诸如释放后使用之类的错误。发布版本无法做到这一点
您可能只是误读了调试输出。向量*和int*内存仍然存在。调试器可能只是想更聪明地处理向量。如果要正确执行此操作,需要
删除[]t->n代码>和删除t->num代码>在执行之前删除t代码>-但更正确的方法是“正确”使用面向对象,让t
的构造函数和析构函数处理n
和num
的内存分配和释放,这样可以自动为类本身正确管理内存
我还想指出,使用指向std::vector
的指针很少是正确的-向量本身不会占用那么多空间,因此您可能应该使用std::vector num代码>而不是指向它的指针。这也意味着num
会在析构函数中自动销毁,而不需要任何额外的代码。如果要正确执行此操作,需要删除[]t->n代码>和删除t->num代码>在执行之前删除t代码>-但更正确的方法是“正确”使用面向对象,让t
的构造函数和析构函数处理n
和num
的内存分配和释放,这样可以自动为类本身正确管理内存
我还想指出,使用指向std::vector
的指针很少是正确的-向量本身不会占用那么多空间,因此您可能应该使用std::vector num代码>而不是指向它的指针。这也意味着num
会在析构函数中自动销毁,而不需要任何额外的代码。指向向量的指针没有什么不同。尽管调试器可能会让您相信什么,但您仍然必须在这个新指针上调用delete
。您的测试没有用任何初始值填充向量,所以当然testV->size()
将为0。对不起,我现在填充了它,它(大小)是负数,所以我猜内存是自动清理的?我只是不明白为什么它不再是10,如果这个内存泄漏了,它应该保持不变吗?vector::size\u type
是否正确地打印为int
?如果改用cout
,会发生什么情况?我刚刚尝试了你的示例,无法重现你描述的行为。指向向量的指针没有什么不同。尽管调试器可能会让您相信什么,但您仍然必须在这个新指针上调用delete
。您的测试没有用任何初始值填充向量,所以当然testV->size()
将为0。对不起,我现在填充了它,它(大小)是负数,所以我猜内存是自动清理的?我只是不明白为什么它不再是10,如果这个内存泄漏了,它应该保持不变吗?vector::size\u type
是否正确地打印为int
?如果你用cout
来代替,会发生什么?我刚刚试过你的例子,我无法重现你描述的行为。我刚刚编辑了我的问题,我确实可以检查内存。我最初是通过内存间谍工具来实现的,在vs2010中,alt+6可以实现。现在,在我的新代码中,我用另一个指针检查它们。它们的行为与我在VS2010中描述的一样,因为没有释放t->n
,所以在释放t
后,内存分配将保持不变,是的。t
中的指针被覆盖(在调试版本中)。释放后使用t
中的任何内容都是“未定义的行为”,这意味着它可能无法按照您的预期工作-无论您预期如何。我还认为t->num(向量指针)应该会导致泄漏,但在我的测试中,它看到了