我有一個簡單的類:重置對象m_object = Object(new,parameters);
class Histogram {
int m_width;
int m_height;
int m_sampleSize;
int m_bufferWidth;
int m_bufferHeight;
uint8* m_buffer;
int m_size;
public:
Histogram() : m_buffer(0) { }
Histogram(int width, int height, int sampleSize) {
m_buffer = new unsigned char [width*height*sampleSize];
}
~Histogram() {
my_log("destructor: buffer: %p", m_buffer);
if (m_buffer) { delete [] m_buffer; m_buffer = NULL; }
}
unsigned char* buffer() {
return m_buffer;
}
};
它是在其他類中的成員:
class Other {
Histogram m_histogram;
void reset() {
my_log("reset() called: buffer: %p", m_histogram.buffer());
m_histogram = Histogram(512, 512, 2);
}
}
現在,我首先使用直方圖創建「未初始化的」對象()構造 - 其中規定m_buffer爲NULL ;
然後,我調用重置方法,它會執行m_histogram =直方圖(512,512,3) - 新對象具有通過new初始化的m_buffer。
所以預計日誌消息的順序是:
- 「復位()調用:緩衝液:爲0x0」
- 「析:緩衝區:爲0x0」
但是,相反,我得到:
- 「復位()調用:緩衝液:爲0x0」
- 「析構函數:BU ffer:0x072a7de「
因此,一些不合理的行爲正在執行。此外,我還刪除了第二個對象(用「較大」構造函數創建,帶有三個int參數)時顯示0x072a7de地址。
由編譯器生成的默認拷貝構造函數和賦值運算符不能很好地使用指針。你需要遵守'三條規則'(或者C++ 11中的五條規則),請參閱:http://stackoverflow.com/a/255744/14065 – 2012-07-20 07:05:38