c++ - 重置对象 object = Object(new, parameters);

标签 c++ constructor copy-constructor

我有一个简单的类:

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/

相关文章:

c# - 在多行文本框中显示 ArrayList 条目

c++ - 如果可用,调用类型的标记构造函数,否则默认

c++ - 什么时候应该让一个类不可复制?

c++ - 图像写入功能未执行

python - 我可以通过命令行参数将多少数据传递给 C++ 程序?

c# - 可空非引用类型变量是否需要 new()?

c++ - 为什么在调用重载赋值运算符时调用复制构造函数?

c++ - 运算符重载实现 : 0xC0000005: Access violation reading location

c++ - std::string 构造函数中的 ITERATOR LIST CORRUPTED

c++ - 'clock_gettime' 和 'gettimeofday' 的奇怪计时结果