codechaser
V2EX  ›  C++

出错原因

  •  
  •   codechaser · Nov 9, 2019 · 3638 views
    This topic created in 2401 days ago, the information mentioned may be changed or developed.
    #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 replies    2019-11-10 11:58:31 +08:00
    pagxir
        1
    pagxir  
       Nov 9, 2019 via Android   ❤️ 1
    因为你没定义拷贝构造函数导致使用了缺省拷贝构造函数。所以结果是同一片内存反复 delete 两次。
    secondwtq
        2
    secondwtq  
       Nov 9, 2019
    天灭 raw pointer, unique_ptr 保平安
    codechaser
        3
    codechaser  
    OP
       Nov 9, 2019
    @secondwtq 这只是一道题,哈哈。
    v2byy
        4
    v2byy  
       Nov 10, 2019
    the rule of five. 需要任意之一,一般情况下其他也可能需要
    nightwitch
        5
    nightwitch  
       Nov 10, 2019
    B 类的拷贝构造函数不会重新为 p 指针申请内存,导致 p 指针浅复制一次,double free.
    C++ primer 有提过,如果你不确定编译器会为你生成什么函数,最好显示声明所有的构造函数,以避免意料之外的表现
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2921 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 05:34 · PVG 13:34 · LAX 22:34 · JFK 01:34
    ♥ Do have faith in what you're doing.