【发布时间】:2019-11-24 15:47:37
【问题描述】:
我有一个类,它包含一个属性 char * 变量名,它指向一个从 new char[] 分配的 char 数组,该数组包含一个 C 样式的文本字符串。我正在使用具有属性 char[] 变量 name_val 并且等于“emtpy”的重载构造函数。在成员初始化列表中,我已将私有类成员名称初始化为 nullptr,并且在构造函数内部,我已为其分配空间取决于在 name_val 的大小上,使用 strcpy 将其复制到 name。当我编译程序时,我收到警告说, [警告] 不推荐将字符串常量转换为 'char*' [-Wwrite-strings]。我还看到内存泄漏。所以我花了一点时间搞砸,一旦我将 char name_val 设置为 const char name_val[]="empty",在重载的构造函数中,一切都工作得很好。
这里是代码,请注意,在重载的构造函数中,属性 char[] 变量名 name_val 没有设置为 const!
有人可以解释一下,在这种情况下 const 的目的是什么?
#include<iostream>
#include<cstring>
using namespace std;
class Person{
char *name;
public:
Person(char name_val[]="empty"):
name{nullptr}{
name=new char[strlen(name_val)+1];
strcpy(name,name_val);
}
~Person(){
delete [] name;name=nullptr;
}
char *get_Name()const{return name;}
};
int main(){
Person p;
cout<<p.get_Name()<<endl;
return 0;
}
【问题讨论】:
-
像
"empty"这样的字符串文字可以存储在只读内存中。如果你用一个非 const 指针指向它,你就会为name_val[0] = 'X';这样的废话打开大门,而 Crom 只知道什么样的坏蓝精灵会试图写下它。 -
你怎么知道你有内存泄漏?
标签: c++