【发布时间】:2014-09-01 14:51:11
【问题描述】:
我的代码如下:
class CDemo {
public:
CDemo()
: str(NULL){
};
~CDemo() {
if (str)
delete[] str;
};
char* str;
};
void testVector() {
CDemo c;
c.str = new char[32];
strcpy(c.str, "abcdef");
vector<CDemo>* v = new vector<CDemo>();
v->push_back(c);
delete (v);
return;
}
我知道这是一个会报告运行时错误的代码,因为我没有显式定义复制构造函数,所以,当testVector 返回时,成员字段str 将被释放两次,从而报告一个错误。但让我感到困惑的是,当我调试到该行时:delete(v),Visual Studio 快捷方式如下:
我认为函数push_back会导致对象c的default copy constructor的调用,所以,在push_back返回之后,向量v的元素应该是与c不同的对象,但从调试手表来看,我发现它们是相同的address:0x00318100。是否证明它们实际上是同一个对象?
谁能解释一下?
【问题讨论】:
-
它确实推送对象的副本。您有两个相同指针的副本。
-
但调试器显示存储在
str中的地址。这正是你自己说的你期望是一样的。 -
CDemo的默认复制构造函数复制的是str的指针值,而不是指向的数据。 -
这是 char 字符串的地址,因此它们相同是完全正常的
-
看到汉字,笑死我了。
标签: c++ vector copy-constructor push-back