Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.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++ 这会不会";“智能指针”;代码泄漏内存? 我想知道,当代码 fn>代码>被称为:_C++_Memory_Memory Leaks - Fatal编程技术网 代码>被称为:,c++,memory,memory-leaks,C++,Memory,Memory Leaks" /> 代码>被称为:,c++,memory,memory-leaks,C++,Memory,Memory Leaks" />

C++ 这会不会";“智能指针”;代码泄漏内存? 我想知道,当代码 fn>代码>被称为:

C++ 这会不会";“智能指针”;代码泄漏内存? 我想知道,当代码 fn>代码>被称为:,c++,memory,memory-leaks,C++,Memory,Memory Leaks,时,从加速C++部分中删除这个代码是否会导致内存泄漏? class IntPtr { public: IntPtr (): p(NULL) {}; IntPtr (int *ip): p(ip) {}; IntPtr (const IntPtr& other) { p = new int(*other.p); }; IntPtr& operator= (const IntPtr&); ~IntPtr () { delete p; }; private

时,从加速C++部分中删除这个代码是否会导致内存泄漏?
class IntPtr {
public:
  IntPtr (): p(NULL) {};
  IntPtr (int *ip): p(ip) {};
  IntPtr (const IntPtr& other) { p = new int(*other.p); };
  IntPtr& operator= (const IntPtr&);
  ~IntPtr () { delete p; };

private:
  int *p;
}

IntPtr& IntPtr::operator= (const IntPtr& other) {
  if (&other != this) { delete p; p = new int(*other.p); }
  return *this;
}

void fn () {
    IntPtr a;
    a = new int(9);
}
下面是我认为当到达行
a=newint(9)
时会发生的情况:

  • newint(9)
    为堆中的单个
    int
    (9)分配内存,并返回指向该内存的指针(一个
    int*
  • 使用上面获得的
    int*
    和适当的构造函数创建
    IntPtr
  • 调用
    IntPtr::operator=
    ,将LHS a和上面创建的
    IntPtr
    作为RHS。此操作为单个int分配另一个内存块。此新块的地址存储在
    a.p
  • 当到达最后一个右大括号时,
    a
    被销毁,第二个内存块也随之被销毁。我的问题是:到现在为止,第一个街区发生了什么?它还在堆上,没有任何东西指向它吗?在行动2中创建的
    IntPtr
    的命运是什么

    我的问题是:到现在为止,第一个街区发生了什么?它还在堆上,没有任何东西指向它吗?在行动2中创建的IntPtr的命运是什么

    您可以重写这一行:

    a = new int(9);
    
    作为:

    编译器在赋值期间创建一个临时对象,该对象将在赋值期间使用。它的析构函数将在语句末尾被调用(行末尾的分号)


    此代码看起来正常-不应发生内存泄漏。

    使用调试器,写下内存块的地址,逐步执行代码。第2节的
    IntPtr
    是临时创建的。任务完成后,它将被销毁。为了说明发生了什么,将输出添加到
    IntPtr
    的每个方法中,您将在控制台上看到这一点。在步骤2中创建的
    IntPtr
    是临时的,并且在语句
    a=new int(9)
    完成时不再存在。或者,您可以考虑“移动分配”它将指针从RHS传输到LHS,并将RHS重置为0。为此,您必须将参数更改为
    IntPtr&other
    。这可能会有帮助:我查看了亚马逊,这本书加速了C++的过时:(2000年8月24日)。它肯定不包括自C++11以来的更改。在更现代的书中,作者会建议使用智能指针。但这可能是一个关于类如何工作的练习。从内存泄漏的角度来看,代码看起来还可以,但在其他方面(即,它不是异常安全的)。它看起来更像是一个关于类如何工作的练习。
    a = IntPtr(new int(9));
        ^^^^^^