我的代碼就像下面:爲什麼push_back不會推送源obj的副本?
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
將被釋放的兩倍,因此報告的error.But什麼使我困惑,就是當我調試到行:delete(v)
,Visual Studio的快捷方式如下:
我認爲功能push_back
會導致物品的default copy constructor
的致電10,所以在push_back
返回後,矢量v
的元素應該是與c
不同的對象,但是從調試手錶中,我發現它們是相同的address:0x00318100
。它是否證明它們實際上是同一個對象? 任何人都可以解釋這一點?
它*推*的對象的副本。你有兩個相同指針的副本。 – chris 2014-09-01 14:52:57
但調試器顯示存儲在'str'中的地址。這正是你自己說你*期待*是一樣的。 – Angew 2014-09-01 14:53:04
'CDemo'的默認拷貝構造函數複製'str'的指針值,而不是指向的數據。 – NetVipeC 2014-09-01 14:55:15