我知道这是非常基本的但不知何故在不同的技术上我已经把我的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 [],但仍然是错误
答案 0 :(得分:7)
你真的应该在这里使用std::string
。
它非常容易,特别是初学者。错误列表是:
name
的错误尺寸,它应为strlen(name)+1
,而不是使用sizeof
任何内容。 new char[strlen(name)+1]
。 strcpy
而不是name_p = name
- 后者泄漏您刚刚分配的内存,然后您有一个指向您不应删除的const char *
。 delete [] name_p;
。 但是,你使用std::string
,所有上述问题都完全消失了,你可以这样做:
Employee(char *name) name_p(name) { ... }
并摆脱所有有问题的new
,delete
和复制。当然,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
课程将为您管理记忆。