Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何删除C+中新运算符占用的内存+;_C++ - Fatal编程技术网

C++ 如何删除C+中新运算符占用的内存+;

C++ 如何删除C+中新运算符占用的内存+;,c++,C++,可能重复: 我是C++内存分析中的新手。 Valgrind报告这条管线有泄漏 m_propertyManager(new coral::PropertyManager); 所以我把它改成 coral::PropertyManager Mgr; m_propertyManager(&Mgr); 我猜&Mgr会自动删除,但valgrind再次报告此漏洞。new coral::PropertyManager会在堆上分配一个新的PropertyManager,但因为它是一个临时变量,所以您

可能重复:

<>我是C++内存分析中的新手。 Valgrind报告这条管线有泄漏

m_propertyManager(new coral::PropertyManager);
所以我把它改成

coral::PropertyManager Mgr;
m_propertyManager(&Mgr);

我猜
&Mgr
会自动删除,但valgrind再次报告此漏洞。

new coral::PropertyManager会在堆上分配一个新的PropertyManager,但因为它是一个临时变量,所以您永远不会释放它。这是标准的Java习惯用法,因为Java是一种垃圾收集语言,GC将负责为您发布这个悬而未决的引用

如果出于某种原因想在此处使用
new
,正确的方法如下:

auto *pm = new coral::PropertyManager; // auto is C++11 syntax
m_propertyManager(pm);
delete pm; // when you're done using it
您的第二个选项是正确的,因为它将
Mgr
分配为堆栈上的自动变量,该变量将在函数退出时释放<代码>m_propertyManager(&Mgr)将Mgr的地址传递给函数,这将允许它修改Mgr对象(尽管通过将Mgr作为引用传递可能会更好)


请注意,如果m_propertyManager是在当前作用域退出后仍然存在的对象,并且如果它将对Mgr的引用存储在某个位置,那么当您退出当前作用域并且Mgr对象被销毁时,您将发现m_propertyManager持有对无效内存的引用。

如果您使用
new
分配内存,您必须使用
delete
将其释放到某个地方。如果
m_propertyManager
不应该管理
propertyManager
的生存期,那么它只会将指针扔掉,留下已分配的内存,不允许访问

另一方面,您的第二个解决方案将崩溃。看:

{
    coral::PropertyManager Mgr;
    m_propertyManager->SetManager(&Mgr); // You pass pointer to Mgr here
}
// Here Mgr no longer exists, so m_propertyManager
// now contains the pointer to non-existing object
你应该:

  • 动态创建
    PropertyManager
    (使用
    new
    ),在某个位置保留指向它的指针,并在某个位置使用
    delete
    显式释放它
  • PropertyManager
    中实现move-ctor并按值传递(这样
    m\u PropertyManager
    将隐式自动分配自己的
    PropertyManager
    实例)
  • 使用静态分配(如第二个示例中所示),但将实例保留在适当的位置,在
    m_propertyManager
    期间,实例将保持活动状态
  • 在m_propertyManager中使用某种自动指针(如std::shared_ptr或std::unique_ptr)

最好像m_propertyManager(std::unique_ptr(新coral::propertyManager))一样使用std::unique_ptr@经理:我可能弄错了,但这不是因为您不能将唯一指针的副本传递给函数吗?在这个用例中,std::shared\u ptr不是更明智的选择吗?如果我错了,请纠正我。是的,你是对的,这里需要一个共享指针。