首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >这个“智能指针”代码会泄漏内存吗?

问这个“智能指针”代码会泄漏内存吗?
EN

Stack Overflow用户
提问于 2017-03-06 11:54:33
回答 1查看 90关注 0票数 2

我想知道,在调用C++时,这些代码(来自加速fn 14.1.2节)是否会导致内存泄漏:

代码语言:javascript
复制
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 = new int(9)行时会发生的情况:

  1. new int(9)为堆中的单个int (9)分配内存,并返回指向该内存的指针( int *)。
  2. IntPtr是使用上面获得的int *和适当的构造函数创建的。
  3. IntPtr::operator=被调用,LHS a和上面创建的IntPtr被称为RHS。此操作为单个int分配另一个内存块。这个新块的地址存储在a.p中。

当到达最后一个关闭大括号时,a被销毁,第二个内存块也随之被销毁。我的问题是:到目前为止,第一个街区发生了什么?它还在堆里,什么也没有指向它吗?在行动2中创建的IntPtr的命运是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-06 12:03:41

我的问题是:到目前为止,第一个街区发生了什么?它还在堆里,什么也没有指向它吗?在行动2中创建的IntPtr的命运是什么?

您可以重写这一行:

代码语言:javascript
复制
a = new int(9);

作为:

代码语言:javascript
复制
a = IntPtr(new int(9));
    ^^^^^^ 

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

这段代码看起来没问题-不应该发生内存泄漏。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42624996

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档