私は単純なクラスを持っています:
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);
}
}
ここで、最初に Histogram() コンストラクター (m_buffer を NULL に設定) を使用して「初期化されていない」オブジェクトを作成します。
次に、m_histogram = Histogram( 512, 512, 3 ) を実行する reset メソッドを呼び出します。新しいオブジェクトには、new によって初期化された m_buffer があります。
したがって、予想されるログ メッセージの順序は次のとおりです。
- 「reset() が呼び出されました: バッファ: 0x0」
- 「デストラクタ: バッファ: 0x0」
しかし、代わりに、私は得る:
- 「reset() が呼び出されました: バッファ: 0x0」
- 「デストラクタ: バッファ: 0x072a7de」
したがって、いくつかの不合理な行動が実行されています。さらに、2 番目のオブジェクト (3 つの int パラメータを持つ「より大きな」コンストラクタで作成) も削除すると、アドレス 0x072a7de が表示されます。