析构函数中的异常错误

DNa*_*mto 0 c++ destructor exception

我知道这是非常基本的,但不知何故我正在研究不同的技术,我已经把我的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);
}
Run Code Online (Sandbox Code Playgroud)

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

Mat*_*son 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;.

但是,你反而使用std::string,所有上述问题都完全消失了,你可以这样做:

Employee(char *name) name_p(name) { ... } 
Run Code Online (Sandbox Code Playgroud)

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