Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.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++_Memory Leaks - Fatal编程技术网

C++ 为什么这里没有内存泄漏

C++ 为什么这里没有内存泄漏,c++,memory-leaks,C++,Memory Leaks,我试图回答这个问题,所以我决定创建以下简单的测试用例,以便OP能够自己看到内存泄漏 #include<iostream> class MyObject { public: MyObject(){std::cout << "creation of my object" << std::endl;} virtual ~MyObject(){std::cout << "destruction of my object" << s

我试图回答这个问题,所以我决定创建以下简单的测试用例,以便OP能够自己看到内存泄漏

#include<iostream>

class MyObject
{
public:
   MyObject(){std::cout << "creation of my object" << std::endl;}
   virtual ~MyObject(){std::cout << "destruction of my object" << std::endl;}
};

void processMyObject(MyObject foo)
{
}

int main()
{
   processMyObject(*new MyObject());
   return 0;
}
然后,我看到了一个意外的输出:

creation of my object
destruction of my object
我完全不知道这里发生了什么。谁能给我解释一下吗


PS:我使用了g++4.6.3,因为您是按值获取MyObject

因此有一种破坏。但这是对
processMyObject
末尾的
foo
参数的破坏

在这种情况下,
*新的
实际上仍然会泄漏


编辑:正如juanchopanza所指出的,您还需要在复制构造函数和移动构造函数中打印语句。

实际上存在内存泄漏。仅仅因为您的对象被销毁,并不意味着您删除了通过
new
获得的资源。您必须明确使用
delete

编辑

下面是正在发生的事情:

  • 您正在动态调用默认构造函数,并将其传递给函数调用。这将打印第一条消息
  • 作为函数调用的一部分,对象将传递到
    processMyObject()
    ,使用编译器隐式定义的复制构造函数在该范围内创建一个新对象
  • 当该对象(在
    processMyObject()
    中)超出范围时,将调用其析构函数,打印第二条消息
  • 因此,打印第一条消息的实例与打印第二条消息的实例不同


    希望这能把事情弄清楚。

    代码中发生了什么

    • 构造一个对象并获取有关它的信息(
      创建我的对象
    • 您将其传递给函数复制构造函数,但不报告任何内容
    • 副本已销毁-您将获得有关它的信息(
      销毁我的对象
    • 原始实例泄漏,尽管事实上,您没有关于它的任何信息
    如何看待它?

    在构建和销毁过程中,只需报告指向此的指针(quick'n'dirty,请不要抱怨):

    如您所见,销毁的对象与创建的对象不同

    如何“修复”它以显示泄漏?

    “修复”代码的最简单方法是通过指针传递对象:

    #include<iostream>
    
    class MyObject
    {
    public:
       MyObject(){std::cout << "creation of my object" << std::endl;}
       virtual ~MyObject(){std::cout << "destruction of my object" << std::endl;}
    };
    
    void processMyObject(MyObject * foo)
    {
    }
    
    int main()
    {
       processMyObject(new MyObject());
       return 0;
    }
    
    #包括
    类MyObject
    {
    公众:
    
    MyObject(){std::cout由于您通过值将对象传递给函数,因此会产生复制或移动复制构造。但您无法使用基本内存泄漏检查器跟踪该构造。您可以提供自己的复制构造函数,然后您将看到创建了两个对象,并且只销毁了一个:

    #include<iostream>
    
    class MyObject
    {
    public:
      MyObject() {std::cout << "creation of my object" << std::endl;}
      MyObject(const MyObject&) {std::cout << "copy creation of my object" << std::endl;}
      ~MyObject() {std::cout << "destruction of my object" << std::endl;}
    };
    
    void processMyObject(MyObject foo) {}
    
    int main() 
    {
      processMyObject(*new MyObject());
    }
    

    内存泄漏。你也需要检测复制和移动复制构造函数。是的,但问题是为什么我们可以看到某些内容被删除?@doctorlove事实上,这是在评论中指出的。我编辑以提及它:)哦,现在我明白了。我有点不好意思自己找不到它。谢谢!@doctorlove我在打印指向此的指针以及构建/销毁报告是跟踪内存泄漏的一种简单而有效的方法:)
    creation of my object (165437448)
    destruction of my object (-1076708692)
    
    #include<iostream>
    
    class MyObject
    {
    public:
       MyObject(){std::cout << "creation of my object" << std::endl;}
       virtual ~MyObject(){std::cout << "destruction of my object" << std::endl;}
    };
    
    void processMyObject(MyObject * foo)
    {
    }
    
    int main()
    {
       processMyObject(new MyObject());
       return 0;
    }
    
    class MyObject
    {
    public:
       MyObject(){std::cout << "creation of my object" << std::endl;}
       MyObject(const MyObject & obj) { std::cout << "copy-ctor" << std::endl; }
       MyObject(MyObject && obj) { std::cout << "move-ctor" << std::endl; }
       virtual ~MyObject(){std::cout << "destruction of my object" << std::endl;}
    };
    
    #include<iostream>
    
    class MyObject
    {
    public:
      MyObject() {std::cout << "creation of my object" << std::endl;}
      MyObject(const MyObject&) {std::cout << "copy creation of my object" << std::endl;}
      ~MyObject() {std::cout << "destruction of my object" << std::endl;}
    };
    
    void processMyObject(MyObject foo) {}
    
    int main() 
    {
      processMyObject(*new MyObject());
    }
    
    creation of my object
    copy creation of my object
    destruction of my object