首先先来一段代码,说明我的自主删除器:
template <typename T>
class FFmpegDeleteer {
public:
void operator()(T* ptr) const {
if (ptr) {
delete ptr;
}
}
};
template<>
class FFmpegDeleteer<AVFormatContext> {
public:
void operator()(AVFormatContext* ptr) const{
if (ptr) {
if (ptr->pb) {
avio_closep(&ptr->pb);
}
avformat_free_context(ptr);
}
}
};
然后当我采用这样子的初始化智能指针方式时候,程序没有内存问题:
std::shared_ptr<AVFormatContext> iFmtCtx=std::make_shared<AVFormatContext>();
AVFormatContext* temp_iFmtCtx = nullptr; //不能取智能指针包裹的指针的地址,因为其返回的是一个临时值(右值)
auto res_1 = avformat_open_input(&temp_iFmtCtx, LOCALFILE, NULL, NULL);
if (res_1 < 0) {
char errbuff[AV_ERROR_MAX_STRING_SIZE];
av_strerror(res_1, errbuff, sizeof(errbuff));
av_log(nullptr, AV_LOG_ERROR, "Error:%s\n",errbuff);
return;
//exit(-1);智能指针不会执行析构函数,因为程序会强行终止,不回收栈了
}
iFmtCtx.reset(temp_iFmtCtx, FFmpegDeleteer<AVFormatContext>());
temp_iFmtCtx = nullptr;
而当我采用这样子的初始话方式的时候就出现内存问题了
std::shared_ptr<AVFormatContext> iFmtCtx(NULL, FFmpegDeleteer<AVFormatContext>());
AVFormatContext* temp_iFmtCtx = nullptr; //不能取智能指针包裹的指针的地址,因为其返回的是一个临时值(右值)
auto res_1 = avformat_open_input(&temp_iFmtCtx, LOCALFILE, NULL, NULL);
if (res_1 < 0) {
char errbuff[AV_ERROR_MAX_STRING_SIZE];
av_strerror(res_1, errbuff, sizeof(errbuff));
av_log(nullptr, AV_LOG_ERROR, "Error:%s\n",errbuff);
return;
//exit(-1);智能指针不会执行析构函数,因为程序会强行终止,不回收栈了
}
iFmtCtx.reset(temp_iFmtCtx, FFmpegDeleteer<AVFormatContext>());
temp_iFmtCtx = nullptr;
仅仅只是将
std::shared_ptr<AVFormatContext> iFmtCtx=std::make_shared<AVFormatContext>();
换成
std::shared_ptr<AVFormatContext> iFmtCtx(NULL, FFmpegDeleteer<AVFormatContext>());
就出现内存问题了,这个问题非常有趣