0

私はこれが非常に基本的なことを知っていますが、どういうわけかさまざまなテクノロジーに取り組んでおり、C++ の概念をマッシュアップしました

簡単なプログラムを作成しましたが、デストラクタが呼び出されると例外が発生します。

以下はコードです:

#include "stdafx.h"
#include<iostream>

using namespace std;

class Employee
{
  public:

    Employee(char *name){
      cout<<"Employee::ctor\n";
      myName_p = new char(sizeof(strlen(name)));
      myName_p = name;
    }

    void disp(){cout<<myName_p;}

    ~Employee()
    {
      cout<<"Employee:dtor\n\n";
      delete myName_p;
    }

  private:
    char *myName_p;
};


int main()
{
    Employee emp("check");
    emp.disp();
    return(0);
}

この基本概念をクリアすることを求めます。私の理解では、この場合 new[] を使用していないため、delete[] は使用できません。delete[] を使用してみましたが、それでもエラーが発生しました

4

2 に答える 2

7

あなたは本当にstd::stringここを使うべきです。

特に初心者にとっては、はるかに簡単です。エラーのリストは次のとおりです。

  1. の間違ったサイズを計算しています。何も使用していないnameはずです。strlen(name)+1sizeof
  2. も使用する必要がありますnew char[strlen(name)+1]
  3. 引数として提供された文字列からコンストラクターにデータをコピーしています。コンストラクターではstrcpyなく使用name_p = nameします。後者は、割り当てたばかりのメモリをリークし、const char *削除してはならないへのポインターを持っています。
  4. 割り当てが正しくなるように修正する場合は、 を使用する必要がありますdelete [] name_p;

ただし、代わりに を使用するstd::stringと、上記の問題はすべて完全に解消され、次のようにすることができます。

Employee(char *name) name_p(name) { ... } 

new問題のあるすべての、deleteおよびコピーを取り除きます。もちろん、name_pおそらく変数の適切な名前ではなくなりましたが、おわかりいただけたと思います。

于 2013-08-12T15:16:30.540 に答える
2

変化する

myName_p = new char(sizeof(strlen(name)));
myName_p = name;

myName_p = strdup(name);

#include <cstring>。これにより、新しいスペースが作成され、パラメーター文字列がコピーされます。このように、デストラクタではfreeなく呼び出す必要があります。delete

それ以外の場合、2 番目の代入の後、文字列リテラル"check"myName_pに代入したため、新しく作成されたスペースは破棄されます。"check"次に、デストラクタは割り当てられたスペースではなく削除を試み、その結果、クラッシュが発生します。

また、古い文字列std::stringではなく、次のように使用することをお勧めします。char*

class Employee
{
public:
  Employee(char *name): myName_p(name) {
    cout<<"Employee::ctor\n";
  }

  void disp(){ cout << myName_p; }

private:
  std::string myName_p;
};

stringクラスがメモリを管理します。

于 2013-08-12T15:09:26.103 に答える