我有一个简单的类:
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;
然后,我调用 reset 方法,它执行 m_histogram = Histogram( 512, 512, 3 ) – 新对象通过 new 初始化了 m_buffer。
所以预期的日志消息顺序是:
- “调用了 reset():缓冲区:0x0”
- “析构函数:缓冲区:0x0”
但相反,我得到:
- “调用了 reset():缓冲区:0x0”
- “析构函数:缓冲区:0x072a7de”
因此正在执行一些不合理的操作。此外,当我还删除第二个对象(使用“更大的”构造函数创建,具有三个 int 参数)时,会显示 0x072a7de 地址。
最佳答案
您必须为类直方图实现复制构造函数和赋值运算符,因为
m_histogram = Histogram(512, 512, 2);
是赋值运算符调用。隐式运算符 = 按位复制您的类的成员。
而且你必须在析构函数中使用delete[]
,而不是delete
,因为你分配了一个数组。
关于c++ - 重置对象 object = Object(new, parameters);,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11574221/