析构函数中的异常错误

时间:2013-08-12 15:07:07

标签: c++ exception destructor

我知道这是非常基本的但不知何故在不同的技术上我已经把我的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);
}

要求所有人明确这个基本概念。根据我的理解,我们不能使用delete [],因为在这种情况下我们没有使用new []。虽然我尝试过使用delete [],但仍然是错误

2 个答案:

答案 0 :(得分:7)

你真的应该在这里使用std::string

它非常容易,特别是初学者。错误列表是:

  1. 您正在计算name的错误尺寸,它应为strlen(name)+1,而不是使用sizeof任何内容。
  2. 您还应该使用new char[strlen(name)+1]
  3. 您正在将作为参数提供的字符串中的数据复制到构造函数中,使用strcpy而不是name_p = name - 后者泄漏您刚刚分配的内存,然后您有一个指向您不应删除的const char *
  4. 如果您修改了分配以使其正确,则应使用delete [] name_p;
  5. 但是,你使用std::string,所有上述问题都完全消失了,你可以这样做:

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

    并摆脱所有有问题的newdelete和复制。当然,name_p可能不再是变量的合适名称,但是你明白了。

答案 1 :(得分:2)

更改

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

myName_p = strdup(name);

#include <cstring>。这将创建新空间并复制参数字符串。这样,您就必须在析构函数中调用free而不是delete

否则,在第二次分配之后,您已将字符串文字"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课程将为您管理记忆。