Char*没有在我的类中保留文本-初始化构造函数问题

Char* not retaining text inside my class - initialization constructor problem?

本文关键字:文本 保留 初始化 问题 构造函数 我的 Char      更新时间:2023-10-16

我有以下类(我已经修剪了不相关的内容):

class Example
{
    private:
        char* name;
        int value[4];
        int numVals;
    public:
        Example();
        Example(char name[], int numVals, int, int, int, int);
        ~Example();
};

下面是初始化构造函数:

Example::Example(char na[], int vals, int v1, int v2, int v3, int v4)
{
    name = new char[strlen(na)+1];
    strcpy(name, na);
    numVals = vals;
    value[0] = v1;
    value[1] = v2;
    value[2] = v3;
    value[3] = v4;
    // cout << name; // this DOES print out the correct text
}

在我的main()中,我有一个示例类的数组,Example myArray[numRecs]。然后我有一个循环,使用初始化构造函数来填充数组:

myArray[i] = Example(name, numVals, v[0], v[1], v[2], v[3]);

一切工作如预期,然而name不保留我放入它的字符。我使用cout检查了当它传递到构造函数时的值是什么,它是正确的!然而,当我使用我的Example::Print()时,它吐出一个随机字符(对于Example的每个实例都是相同的字符)。

示例::Print()
void Example::Print()
{
    int total, avg;
    total = avg = 0;
    cout << left << setw(20) << name << 't';
    for(int i=0; i<4; i++){
        if(i<numVals){
            cout << left << setw(8) << value[i];
            total += value[i];
        } else
            cout << left << setw(8) << " ";
    }
    avg = total/numVals;
    cout << left << setw(8) << total <<
        left << setw(8) << avg << endl;
}

任何想法?谢谢!

哦,还有,这是作业。我们已经被告知将name字段保持为char指针,而不是字符串。我很困惑,我应该使用什么初始化构造函数(char* name或char name[]或..有区别吗?)

编辑:这是析构函数和默认构造函数。我还没有复制构造函数,因为赋值没有调用它,也没有使用它。无论如何,为了完整起见,我还是要做一个。

Example::~Example()
{
    delete [] name;
}
Example::Example()
{
    numVals = 0;
    for(int i=0; i<4; i++)
        value[i] = -1;
}

您应该通过内存调试器运行您的程序来见证您所创建的噩梦!

你在你的类中使用手动内存管理,但是你忘了遵守规则三:你没有实现复制构造函数、赋值操作符和析构函数!因此,临时确实分配内存,复制指针(粗略地),然后可能在超出作用域时使内存无效。

立即"修复我的代码"的答案是,你必须实现一个适当的赋值操作符和复制构造函数来对char数组进行深度复制。

"这是c++"的答案是不使用指针,new和数组,而使用std::string

一个简单的修复方法是在数组中存储指向示例的指针,而不是实际对象。这样,您就不必处理复制(您还没有实现)。