c++ - 如何在没有内存泄漏的情况下返回对新对象的引用? C++

标签 c++ memory-leaks pass-by-reference

我正在为调试系统编写宏

我有一个重载的链式运算符 <<(MessageAssembler& target,message_type msg) ( message_type ) 是运算符的模板参数

它添加了msgtarget类型为 QTextStream 的内部变量.

运营商+=(MessageAssembler& result)MessageAssembler通过 result的流到函数,它根据 result 的参数处理它.

我想做这样的事情:

#define FATAL(facility) NLog::assembler+=MessageAssembler(Log::fatal_sev,facility)<< __FILE__<<":"<<__LINE__

( NLog::assemblerMessageAssembler 类型的静态变量)

它应该确定输出的设施,允许用户通过使用将自己的消息添加到输出

FATAL(some_facility)<<"custom message"<<ObjectWhichCanBePassedToQTextStream()<<AnotherObject();

但是MessageAssembler(Log::fatal_sev,facility)生产 a reference to temporary错误。

这个

MessageAssembler& MessageAssembler::get_instance(Log::Severity _msg_sev,Log::Facility _msg_fac)
{
    MessageAssembler tmp(_msg_sev,_msg_fac);
    return tmp;
}

将返回对不存在对象的引用;

这个

MessageAssembler& MessageAssembler::get_instance(Log::Severity _msg_sev,Log::Facility _msg_fac)
{
    return new MessageAssembler tmp(_msg_sev,_msg_fac);
}

会导致内存泄漏

这个

QScopedPointer<MessageAssembler> MessageAssembler::get_instance(Log::Severity _msg_sev,Log::Facility _msg_fac)
{
    return QScopedPointer<MessageAssembler>(new MessageAssembler tmp(_msg_sev,_msg_fac));
}

不会工作因为QScopedPointer不能按值传递

我不确定是否存储第二个静态变量 MessageAssembler chain_starter;是线程安全的。

我不仅有FATAL宏,因此程序不会总是在调用后终止。

如何返回对新 MessageAssembler 的引用?

编辑: 我的问题是通过安装第三方智能指针库 yasper 解决的。通解由πìντα ῥεῖ提出。

最佳答案

最简洁的答案是:

不要使用原始指针!使用 c++ smart pointer features相反。

最直接的实现似乎是,创建一个 std::unique_ptr<MessageAssembler>实例并返回这个。调用客户端将获得所创建实例的所有权,一旦该引用超出范围,它将自动删除。

关于c++ - 如何在没有内存泄漏的情况下返回对新对象的引用? C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26949513/

相关文章:

memory-leaks - 没有 GDI 泄漏的 VB6 内存泄漏

javascript - Underscore JS _.partial 减少维护备忘录引用并将整数转换为字符串?

c++ - C++ 代码可以在 C++03 和 C++11 中都有效但做不同的事情吗?

c++ - 普通查找和隐藏

c++ - 为什么内联函数默认有外部链接?

c++ - Opengl 圆形旋转

c# - WPF View 模型 GC

javascript - 查找扩展 Javascript 泄漏

r - 在 R 函数中修改变量

python - 类方法使用未传递的数组