首先先来一段代码,说明我的自主删除器

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>());

就出现内存问题了,这个问题非常有趣