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);
}

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

4

2 回答 2

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) { ... } 

并摆脱所有有问题newdelete和复制的。当然,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在您的析构函数中。

否则,在第二次分配之后,您已将字符串文字分配"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 回答