destructor呼叫以前从未构造过的对象



我有以下代码。

class Wave {
int m_length;
data_type * m_data;
public:
    Wave(){
        blah...blah...blah
        m_data = NULL;
        m_length = 0;
        cout << "Wave " << this << " created on " << m_data << " with m_length " <<  m_length << endl;
    }
    Wave(int len, data_type data){
        blah...blah...blah
        if (len) {
            m_length = len;
            m_data = new data_type [m_length];
        } else {
            m_length = 0;
            m_data = NULL;
        }
        cout << "Wave " << this << " created on " << m_data << " with m_length " <<  m_length << endl;
    }

    ~Wave() 
    {
    cout << "Wave " << this << " destructor  on " << m_data << " started ";
        if (m_length) delete[] m_data;
    cout << "and finished " << endl;
    };        


    Wave & operator+= (const Wave wave){
    cout << __FUNCTION__ << ":" << __LINE__ << " m_length " << m_length << endl;
    if (NULL != m_data){
        data_type * tBuf = new data_type [m_length + wave.Length()];
        copy (wave.begin(),wave.end(), copy (begin(),end(),iterator(tBuf)));
        cout << "Wave " << this << " data on " << m_data << " moved onto " << tBuf;
        delete[] m_data;
        m_data = tBuf;
        cout << " and deleted" << endl;
    } else {
        m_data = new data_type [wave.Length()];
        copy (wave.begin(), wave.end(), begin());
        cout << "Wave " << this << " data created on " << m_data << " of length " <<  wave.Length() << endl;
    }
    m_length += wave.Length();
    cout << __FUNCTION__ << ":" << __LINE__ << " m_length " << m_length << endl;
    return *this;
    };
}

main(){
blah..blah..blah
Wave sample;
for (......) {
    cout << pulseNum << "-th High part: " << pulse->first << endl;
    Wave tSample(x,y);
    blah.blah.blah
    sample += tSample;
    cout << endl << pulseNum++ << "-th Low part: " << pulse->second << endl;
    tSample = Wave(a,b);
    blah.blah.blah
    sample += tSample;
}
}

以下是执行的日志此代码

Wave 0x28fe34 created on 0 with m_length 0
0-th High part: 220
Wave 0x28fe54 created on 0xc60f00 with m_length 207
operator+=:211 m_length 0
Wave 0x28fe34 data created on 0xc610a8 of length 207
operator+=:230 m_length 207
Wave 0x28fe9c destructor  on 0xc60f00 started and finished
0-th Low part: 320
Wave 0x28febc created on 0xc61250 with m_length 301
Wave 0x28febc destructor  on 0xc61250 started and finished
operator+=:211 m_length 207
Wave 0x28fe34 data on 0xc610a8 moved to 0xc61250 and deleted 
operator+=:230 m_length 508
Wave 0x28fee0 destructor  on 0xc61250 started and finished
Wave 0x28fe54 destructor  on 0xc61250 started and finished

对我来说最奇怪的事情是,灾难被称为多次,而不是进出器。此外,它被要求用于以前从未制定的对象,而是用于相同的数据地址。
怎么会这样?

Wave具有编译器生成的复制构造函数,您没有看到。

例如,此复制构造函数例如构造是Wave & operator+= (const Wave wave)的参数。

如果要简化代码,只需定义 std::vector<data_type> m_data数据成员,而不是使用原始指针(data_type * m_data)。

以这种方式,编译器将自动生成适当的复制构造函数,复制运算符=(还为C 11兼式编译器移动语义)和destructor for You class(自动生成复制的副本构造函数,复制操作员=和Destructor将在成员方面运行,例如,自动生成的复制构造函数将为您的同类的每个数据成员调用复制构造函数)。

分配数据,而不是:

m_data = new data_type [m_length];

使用:

m_data.resize(m_length);

您也可以摆脱m_length数据成员,因为std::vector知道它的大小(您可以通过std::vector::size()方法访问它)。

请注意,std::vector将其所有元素存储在一个连续的内存区域(例如new[]);您可以使用&m_data[0]访问该区域的开始。

相关内容

  • 没有找到相关文章

最新更新