首页 > 解决方案 > 类中字符数组的正确数据成员

问题描述

我正在使用 OCF(正统规范形式)方法在我的 .hpp 文件中实现以下类:

class A {
    public:
        A(const char* theArray, size_t DefualtSize=0);
        ~A();
        A& operator=(const char* anArray);
        
    protected:
        char *theArray;
    };

此类将用于获取字符串并将其存储在堆上的“A”对象中。我的 .cpp 文件中的实现如下:

A::A(const char* anArray, size_t DefaultSize) {
    char *theArray = new char[aDefaultSize];
    strncpy(theArray, anArray, DefaultSize);
};

A::~A() {
    delete[] theArray;
};

我想知道当我写“protected: char *theArray;”时我是否正确地将数据成员添加到类中?我是否应该将 theArray 数据成员声明为其他内容/对其进行初始化。非常感谢!

标签: c++memory-managementheap-memory

解决方案


您的代码不正确,因为您重新声明theArray

A::A(const char* anArray, size_t DefaultSize) {
    char *theArray = new char[aDefaultSize]; // redeclaration here
    strncpy(theArray, anArray, DefaultSize);
};

更好的是这个

A::A(const char* anArray, size_t DefaultSize) {
    theArray = new char[aDefaultSize];       // no redeclaration
    strncpy(theArray, anArray, DefaultSize);
};

在您的版本中,您theArray在构造函数中声明了一个局部变量,该变量隐藏了在类中声明的变量,因此您的构造函数不会初始化类变量。

还有其他问题,strncpy它本身就是一个有问题的函数,因为它不保证结果数组是空终止的。

;在构造函数定义的末尾有一个额外的

new如果抛出异常,您的代码将无法正常运行,因为您的析构函数将尝试删除未初始化的指针。这个更好

A::A(const char* anArray, size_t DefaultSize) : theArray(nullptr) {
    theArray = new char[aDefaultSize];
    strncpy(theArray, anArray, DefaultSize);
}

更好的是这个

A::A(const char* anArray, size_t DefaultSize) : theArray(new char[aDefaultSize]) {
    strncpy(theArray, anArray, DefaultSize);
}

推荐阅读