使用strcpy复制char *数据成员的构造函数

时间:2014-01-22 18:41:51

标签: c++ string copy-constructor

我对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;
}

这也有效吗?如果是,哪种方法更可取?

2 个答案:

答案 0 :(得分:1)

不仅第二个版本不起作用,它还会为您提供内存泄漏 首先将内存分配给str,然后将str指向另一个对象的字符串,这意味着:
1.您无法再访问所分配的内存 2.删除其中一个对象中的字符串后,它也将被删除。

(*)你还应该添加一个赋值运算符。

答案 1 :(得分:0)

  

如果是构造函数和复制构造函数而不是使用strncpy复制数据成员值,如果我使用[代码执行指针复制]

我看到你直接将指针分配给传入的字符串指针而不是strncpy。这会有用吗?不,你正在做的只是一个指针拷贝而不是指针所指向的数据,即你需要深拷贝而不是浅拷贝。您可以使用strncpystd::copy_n

其他多个问题:

  • 使用size_t代替int来存储尺寸
  • 使用构造函数初始化列表而不是在构造函数体内分配
  • 了解new char [len]new char()之间的区别;前者分配一个数组,而后者char初始化为0
  • 了解当您在免费商店中管理对象时,您需要实现赋值运算符,析构函数等.a.k.a 三/五的规则
  • 为指针分配内存,然后通过分配其他内容而不释放它而丢失其引用将泄漏内存
  • 使用std::string会更好,因为它已经过试用和测试