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;
// ...
}
及其实施:
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