我有一个简单的类:重置对象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