向量正在调用析构函数,即使在推回的时刻也是如此..为什么?
vector is calling the destructor even at the moment of push back... why
我在这段代码中注意到了一些东西。即使在推回向量中的元素时也是如此(请参见函数passtoit)。正在调用结构测试的析构函数。谁能给我解释一下吗。。为什么会有这种行为。。。
当我声明静态对象的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;
}
使用std::vector<test>
时,元素被复制到向量中。
x.push_back(test("prakash",(new testHelper(10))));
您正在创建一个实例,该实例被复制然后立即销毁。
当我们使用push_back
将元素插入到向量时,会调用复制构造函数,然后为论证对象创建一个临时对象,然后将其插入到向量中。然后销毁/删除临时对象。
若要检查它的实际工作方式,请尝试在类的私有作用域中重写复制构造函数。push_back
函数将不会被调用,您将得到编译器错误。
首先,当向量被取消构造时,它会破坏每个元素。
template<class _Ty> inline
void _Destroy(_Ty _FARQ *_Ptr)
{ // destroy object at _Ptr
_DESTRUCTOR(_Ty, _Ptr);
}
#define _DESTRUCTOR(ty, ptr) (ptr)->~ty()
其次,您应该知道临时对象何时被销毁。
在表达式语句的末尾(即分号处),或在for、if、while、do和switch语句的控制表达式的末尾销毁所有作为表达式求值结果创建的临时性
请参阅:临时对象
所以,原因是dummy指向的内存被删除了两次。为了避免这种情况,您应该覆盖operator=
test& operator=(const test& t)
{
if(this == &t)
return *this;
name = t.name;
dummy = new testHelper(*t.dummy);
return *this;
}
相关文章:
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- 为什么在全局范围内使用"extern int a"似乎不行?
- 为什么在popback()操作之后,它仍然打印完整的矢量
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 为什么会发生堆损坏
- 为什么使用 "this" 指针调用派生成员函数?
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 为什么比较运算符如此快速
- 为什么 Serial.println(<char[]>);返回随机字符?
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 为什么不;名字在地图上是按顺序排列的吗
- 我的字符计数代码计算错误.为什么
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- 为什么野牛仍在使用"int yylex(void)",却找不到"int yylex(YYS
- 为什么 std::unique 不调用 std::sort?
- 既然存在危险,为什么项目要使用-I include开关
- 向量正在调用析构函数,即使在推回的时刻也是如此..为什么?