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

出错原因

  •  
  •   codechaser · 34 天前 · 1033 次点击
    这是一个创建于 34 天前的主题,其中的信息可能已经有所发展或是发生改变。
    #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
        1
    pagxir   34 天前 via Android   ♥ 1
    因为你没定义拷贝构造函数导致使用了缺省拷贝构造函数。所以结果是同一片内存反复 delete 两次。
        2
    secondwtq   34 天前
    天灭 raw pointer, unique_ptr 保平安
        3
    codechaser   34 天前
    @secondwtq 这只是一道题,哈哈。
        4
    v2byy   33 天前
    the rule of five. 需要任意之一,一般情况下其他也可能需要
        5
    nightwitch   33 天前
    B 类的拷贝构造函数不会重新为 p 指针申请内存,导致 p 指针浅复制一次,double free.
    C++ primer 有提过,如果你不确定编译器会为你生成什么函数,最好显示声明所有的构造函数,以避免意料之外的表现
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2147 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 25ms · UTC 01:48 · PVG 09:48 · LAX 17:48 · JFK 20:48
    ♥ Do have faith in what you're doing.