其他分享
首页 > 其他分享> > c – 当我push_back到向量时调用析构函数

c – 当我push_back到向量时调用析构函数

作者:互联网

我有这个类定义:

class FlashStream
{
public:
    explicit FlashStream(const char * url, vector<uint8> * headers, vector<uint8> * data, void * ndata, void * notifyData = NULL, uint32 lastModified = NULL);
    ~FlashStream();
private:        
    NPStream      _stream;
    // ...
}

(NPStream description)

及其实施:

FlashStream::FlashStream(const char * url, vector<uint8> * headers, vector<uint8> * data, void * ndata, void * notifyData, uint32 lastModified)
{
    // ...
    memset(&_stream, 0, sizeof(NPStream));

    _stream.headers = new char[data->size()]; 

    memcpy((void*)_stream.headers, &(*data)[0], data->size());
    // ...
}

FlashStream::~FlashStream()
{
    // ...
    if(_stream.headers)
        delete [] _stream.headers;
    _stream.headers = NULL;
    // ...
}

现在,当我运行此代码时:

// ...
vector<FlashStream> _streams;
// ...
_streams.push_back(FlashStream(url, headers, data, _npp.ndata, notifyData, lastModified));
// ...

有时我在删除[] _stream.headers时出错;在FlashStream的析构函数中,当我将push_back()传递给向量< FlashStream>时,就会调用它. _streams.

我阅读了this question on SO和其他一些,但所有相同的人都不知道如何优雅有效地解决问题.可能是复制构造函数中的问题,但我不知道如何通过NPStream.headers和NPStream.url的内存分配来实现它?

解决方法:

这个说法:

_streams.push_back(FlashStream(url, headers, data, _npp.ndata, notifyData, lastModified));

相当于:

{
    FlashStream temp(url, headers, data, _npp.ndata, notifyData, lastModified);
    _streams.push_back(temp);
    // temp gets destroyed here
}

因此,您创建一个临时的FlashStream对象,该对象被复制到向量中,然后被破坏.您可以通过在C 11中使用emplace_back()来避免这种情况:

_streams.emplace_back(url, headers, data, _npp.ndata, notifyData, lastModified);

标签:c,destructor,vector
来源: https://codeday.me/bug/20191009/1876397.html