加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 在未构造的东西上调用析构函数

发布时间:2020-12-16 10:21:24 所属栏目:百科 来源:网络整理
导读:以下代码为g版本4.6.2提供了一个例外,但是与g版本4.2.1一样按预期运行.在执行期间打印的消息表明在两种情况下都在从未构造的地址上调用析构函数.我想知道(a)哪些编译器是正确的,(b)为什么某些东西在没有被创建的情况下被破坏.非常感谢. //------------------
以下代码为g版本4.6.2提供了一个例外,但是与g版本4.2.1一样按预期运行.在执行期间打印的消息表明在两种情况下都在从未构造的地址上调用析构函数.我想知道(a)哪些编译器是正确的,(b)为什么某些东西在没有被创建的情况下被破坏.非常感谢.

//------------------------------------------------------
#include <iostream>
using namespace std;

class Poly{
 private:
  float *coeff;
 public:
  Poly(){
    coeff = NULL;
    cout << "Created "<< this << endl;
  }
  Poly(Poly const & p){          // copy constructor
    coeff = NULL;
    cout << "Executed copy constructor.n";
  }
  Poly operator=(Poly const & rhs){
    cout << "Executed assignment. " << this << " = " << &rhs << endl;
  }
  Poly fun(){
    Poly c;
    return c;
  }
  ~Poly(){
    cout << "Destructor: " << this << endl;
    delete[] coeff;
  }
};


main(){
  Poly a;
  a = a.fun();
}
//------------------------------------------------------

对于g 4.6.2,它给出了例外:

% ./a.out
Created 0xbfdcc184
Created 0xbfdcc18c
Executed assignment. 0xbfdcc184 = 0xbfdcc18c
Destructor: 0xbfdcc188
*** glibc detected *** free(): invalid pointer: 0xbfdcc1a8 ***
Aborted

对于g 4.2.1,它执行以下操作

% ./a.out
Created 0x7fff5fbff930
Created 0x7fff5fbff920
Executed assignment. 0x7fff5fbff930 = 0x7fff5fbff920
Destructor: 0x7fff5fbff910
Destructor: 0x7fff5fbff920
Destructor: 0x7fff5fbff930

没有例外,并且通过更多代码,它确实产生了正确的答案.但是,它似乎正在破坏从未构建过的0x7fff5bff910.请注意,永远不会调用复制构造函数,如果存在,它将打印一条消息.

解决方法

看起来你的“Poly operator =”没有返回任何内容.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读