我在这段代码中注意到了一些东西。即使在向后推回向量中的元素时(参见函数passtoit)。正在调用struct test的析构函数。任何人都可以向我解释一下..为什么会有这种行为......
当我声明静态对象的std::vector
并让它运行时,它给出了我的堆损坏问题,并且当我将测试声明为测试指针(*)的std::vector
并删除该指针时如图所示在评论代码中,它工作正常。请解释 。它会帮助我很多。我不知道还有什么要写在这里,以使stackworkflow了解它是有效的问题
#include "stdafx.h"
#include <vector>
#include <iostream>
#include <vld.h>
using namespace std;
class declaration
class testHelper
{
public:
testHelper(int passed):m(passed){}
int m;
~testHelper(){cout<<"deleting as thought";}
};
declaration of structure
struct test
{
// constructor
test(string name,testHelper* help):name(name),dummy(help){}
string name;
testHelper *dummy;
// destructor
~test()
{
cout<<"deleting dummy";
if(dummy!=NULL)
{
delete dummy;
dummy =NULL;
}
}
};
function to pass
int passtoit()
{
std::vector<test> x;
// push back on the vector
x.push_back(test("prakash",(new testHelper(10))));
//for(std::vector<test>::iterator i =x.begin();i!=x.end();++i)
//{
// delete *i;
//}
return 0;
}
main function
int _tmain()
{
// calling the function
passtoit();
return 0;
}
答案 0 :(得分:1)
使用std::vector<test>
时,元素被复制到矢量中。
x.push_back(test("prakash",(new testHelper(10))));
您正在创建一个被复制然后立即销毁的实例。
答案 1 :(得分:0)
当我们使用push_back
向向量插入元素时,将调用复制构造函数,然后为arguement对象创建一个临时对象,然后将其插入到向量中。然后销毁/删除临时对象。
要检查它的实际工作方式,请尝试在该类的私有范围内覆盖复制构造函数。将不会调用push_back
函数,您将收到编译器错误。
答案 2 :(得分:0)
首先,当矢量被解构时,它会摧毁每一个元素。
template<class _Ty> inline
void _Destroy(_Ty _FARQ *_Ptr)
{ // destroy object at _Ptr
_DESTRUCTOR(_Ty, _Ptr);
}
#define _DESTRUCTOR(ty, ptr) (ptr)->~ty()
其次,您应该知道临时对象何时被销毁。
&#34;由于表达式求值而创建的所有临时值都在表达式语句的末尾(即分号)或for的控制表达式的末尾被销毁,if,while,do和切换语句。&#34;
看到这个: Temporary Objects
所以,原因是dummy指向的内存被删除了两次。 为避免这种情况,您应该覆盖operator =
test& operator=(const test& t)
{
if(this == &t)
return *this;
name = t.name;
dummy = new testHelper(*t.dummy);
return *this;
}