V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
codechaser
V2EX  ›  C++

出错原因

  •  
  •   codechaser · 2019-11-09 23:13:17 +08:00 · 3060 次点击
    这是一个创建于 1843 天前的主题,其中的信息可能已经有所发展或是发生改变。
    #include <stdio.h>
    #include <iostream>
    
    using namespace std;
    
    class A{
        int i;
    };
    
    class B{
        A* p;
        public:
        B(){p=new A;}
        ~B(){delete p;}
    };
    
    void say(B b){
    
    }
    
    int main(int argc,char** argv){
        B b;
        say(b);
    }
    

    这里会出错是因为浅拷贝导致的吗?

    5 条回复    2019-11-10 11:58:31 +08:00
    pagxir
        1
    pagxir  
       2019-11-09 23:16:33 +08:00 via Android   ❤️ 1
    因为你没定义拷贝构造函数导致使用了缺省拷贝构造函数。所以结果是同一片内存反复 delete 两次。
    secondwtq
        2
    secondwtq  
       2019-11-09 23:17:27 +08:00
    天灭 raw pointer, unique_ptr 保平安
    codechaser
        3
    codechaser  
    OP
       2019-11-09 23:19:38 +08:00
    @secondwtq 这只是一道题,哈哈。
    v2byy
        4
    v2byy  
       2019-11-10 10:35:38 +08:00
    the rule of five. 需要任意之一,一般情况下其他也可能需要
    nightwitch
        5
    nightwitch  
       2019-11-10 11:58:31 +08:00
    B 类的拷贝构造函数不会重新为 p 指针申请内存,导致 p 指针浅复制一次,double free.
    C++ primer 有提过,如果你不确定编译器会为你生成什么函数,最好显示声明所有的构造函数,以避免意料之外的表现
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5608 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 06:35 · PVG 14:35 · LAX 22:35 · JFK 01:35
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.