-3

コピーコンストラクターを使用する動機の1つは、プログラムでのフォロークラッシュを回避することであることを学びました-

#include <iostream>
using namespace std;

class Employee {
public:
    Employee(int ID,char const * name){...};
    ~Employee(){...};

    // Methods
    void Print();

private:
    // members
    int m_ID;
    char* m_name;
};

void MyFunc(Employee emp) {

    cout << "in MyFunc \n ";

}

int main() {
    Employee One(1,"Garen Torosian");

// calling copy constructor
    MyFunc(One);

    cout << "In the end of main \n";

// Here the program crashes!
    return 0;
}

ご覧のとおり、プログラムはの前にクラッシュするはずですが、return 0;そのプログラムを実行すると正常に動作し、正常に終了しました。なぜですか?

編集:この場合、プログラムは実際にクラッシュします-

// Employee.h
#include <iostream>
using namespace std;

class Employee {
public:
   Employee(int ID, 
                   const char* name);
  ~Employee();

  // Methods
  void Print();

private:
  // members
  int   m_ID;
  char* m_name;
};

// Employee.cpp
#include "Employee.h“

Employee::Employee(int iID, const char *name){ // Ctor
  cout << "Constructor called" << endl;
  m_ID = iID;
  m_name = new char [strlen(name) +1];
  strcpy(m_name, name);
  Print();
}
void Employee::Print() { // Print
cout << "ID: " << m_ID << ",Name:” << m_name
<< " ,Address(pointer):0x" << hex << (int) m_name<< endl;
}
Employee::~Employee() { // Dtor
  cout << "Destructor called"<<endl;
  Print();
  delete [] m_name;
  m_name=NULL;
}

void MyFunc(Employee emp) {

  cout << "in MyFunc \n ";    

}

int main()
{
    Employee One(1,"Eli Rachamim");

// calling copy constructor
MyFunc(One);

cout<< "In the end of main \n“;

// Here the program crashes! 
return 0;
}
4

2 に答える 2

2

あなたd-torが好きなら

~Employee(){ delete[] name; }

char*ポインタにメモリを割り当てます。オブジェクトをコピーするときに呼び出されるコンパイラによって生成されるものはありませんcopy c-tor。したがって、ほとんどの場合、が与えられます(実際には、すでに破壊されたオブジェクトへのデストラクタの呼び出しはであり、すでに削除されたオブジェクトの呼び出しもです)。ただし、メモリを使用しない場合は、コンパイラによって生成されたものが適切に機能します。copy c-tormemberwise-copydouble-freememory dumpUBdelete[]UBcopy c-tor

編集。

したがって、2番目の例はd-tor、すでに破棄されたオブジェクトとの呼び出しを示していますdouble-free

于 2012-09-01T21:15:58.123 に答える
1

なぜクラッシュするはずだと思いますか?

C ++には、自動生成されたコピーコンストラクターを提供しない場合に提供するという不幸な機能があり、MyFunc()は、自動生成されたコピーによって失敗するようなことは何もしません。

于 2012-09-01T21:09:34.277 に答える