【问题标题】:assigning one structure/class object to another with operator "="使用运算符“=”将一个结构/类对象分配给另一个
【发布时间】:2012-07-22 15:32:56
【问题描述】:

我有结构 aa 我正在尝试运行这样的代码:

aa * b = new aa;
aa * c = new aa;
c=b;
delete (b);
c.useSomeFunction

b被销毁后,可以使用c指向的对象吗?

同样的问题:

aa * b = new aa;
aa * c ;
c=b;
delete (b);
c.useSomeFunction

【问题讨论】:

  • 请注意,标题与问题不匹配。您不是将一个结构分配给另一个结构,而是将一个指针分配给另一个。

标签: c++ struct structure assign


【解决方案1】:

在您的示例中,两个指针都指向同一个对象,因此在销毁它之后它们都无效。此外,在您的第一个示例中,c=b 是自动内存泄漏,因为您无法释放在 aa * c = new aa 中分配的内容。


这也不是真正的代码,因为b.usesomefunction 不会编译。你的意思是b->use..

【讨论】:

  • @Hogan 不,c=b 是合法的,但这意味着该对象不能再被释放。
  • @Hogan 我不确定你的意思。
  • @Hogan:C 或 C++ 中没有这样的东西。
  • 我的意思是——内存泄漏意味着您失去了对无法释放的已分配内存的引用。但是,如果您指向一个对象然后删除它,则内存已被释放,但在这种情况下,他指向的是坏内存。如果他使用/访问那个糟糕的内存,他可能会让事情正常进行,或者在某个时候(当有新信息时),当他踩到他无法控制的内存时,他会感到恐慌或其他崩溃。这本身不是泄漏,因为他已经释放了内存。
  • @Hogan 一旦 OP 在第一个示例中执行 c=b,则没有句柄可以删除最初由 c 指向的对象。
【解决方案2】:

问题的标题具有误导性,因为您没有在代码中使用operator=()。您只分配内置类型的指针。

如前所述:

在您的第一个示例中,指针分配产生了内存泄漏,因为对象 (*c) 不能再被删除。您也不能调用(*b) 的函数(即使在删除对象(*b) 后由c 指向。

在您的第二个示例中,您没有遇到内存泄漏。请注意,在生产代码中,您应该使用nullptr 初始化每个指针。同样在这里你删除对象后无法访问(*b)的功能。

对函数的调用必须是 c->useSomeFunction() 才能在语法上正确。

您可能想要(并且由标题建议)是创建一个新对象并将旧对象的内容分配给它。比如:

struct aa {
  aa():x(0),y(0){}
  aa& operator=(const aa& rhs);
  int foo(){return x-y;}
  int x;
  int y;
};

aa& aa::operator=(const aa& rhs){
  if (this == &rhs) {return *this;}
  x = rhs.x; 
  y = rhs.y;
  return *this;
}

int main(){
  aa *b = new aa();
  aa *c = new aa();
  *c = *b;
  delete(b);
  c->foo();
  delete(c);
  return 0;
}

【讨论】:

    猜你喜欢
    • 2016-06-24
    • 1970-01-01
    • 2017-01-25
    • 1970-01-01
    • 2011-01-19
    • 2021-09-09
    • 2012-01-06
    • 1970-01-01
    相关资源
    最近更新 更多