我对char*
数据成员的复制构造函数有疑问。
我的代码为
#include<iostream>
using namespace std;
class Test
{
char *str;
int length;
public:
Test(){}
Test(char *a)
{
length = strlen(a)+1;
str = new char(length);
str = strncpy(str,a,length);
}
Test(const Test &t)
{
length = t.length;
if(t.str)
{
str = new char(length);
str = strncpy(str,t.str,length);
}
else
str = 0;
}
void out(){cout<<str;}
};
int main()
{
Test t("Test");
Test t1 = t;
t1.out();
return 0;
}
如果是构造函数和复制构造函数而不是使用strncpy
来复制数据成员值,如果我使用:
Test(char *a)
{
str = new char();
str = a;
}
Test(const Test &t)
{
if(t.str)
{
str = new char();
str = t.str;
}
else
str = 0;
}
这也有效吗?如果是,哪种方法更可取?
答案 0 :(得分:1)
不仅第二个版本不起作用,它还会为您提供内存泄漏
首先将内存分配给str
,然后将str指向另一个对象的字符串,这意味着:
1.您无法再访问所分配的内存
2.删除其中一个对象中的字符串后,它也将被删除。
(*)你还应该添加一个赋值运算符。
答案 1 :(得分:0)
如果是构造函数和复制构造函数而不是使用strncpy复制数据成员值,如果我使用[代码执行指针复制]
我看到你直接将指针分配给传入的字符串指针而不是strncpy
。这会有用吗?不,你正在做的只是一个指针拷贝而不是指针所指向的数据,即你需要深拷贝而不是浅拷贝。您可以使用strncpy
或std::copy_n
。
其他多个问题:
size_t
代替int
来存储尺寸new char [len]
与new char()
之间的区别;前者分配一个数组,而后者char
初始化为0 std::string
会更好,因为它已经过试用和测试