由先前成员覆盖的类成员值

问题描述 投票:0回答:1

如果创建两个char*类型的类成员并且为数组。如果我调整类的第一个成员的大小,它将用相同的值覆盖第二个成员。为什么会发生?这是一些内存管理问题吗?

#include <iostream>

using namespace std;

class myclass
{
    private:
        const char *arr1[0];
        const char *arr2[4] {
            "one",
            "two",
            "three",
            "four"
        };
    public:
        void run() {
            int f = 0;

            *this->arr1 = new char[4];

            for(f = 0; f < 4; f++) {
                this->arr1[f] = "foo";
            }

            for(f = 0; f < 4; f++) {
                cout << this->arr2[f] << endl;
            }
        }
};

int main()
{
    myclass *my = new myclass();
    my->run();

    return 0;
}

输出

foo
foo
foo
foo
c++ class c++11 memory-management
1个回答
2
投票
const char *arr1[0];

零大小的数组在标准C ++中是不允许的。您的编译器允许它作为语言的扩展。

即使您的编译器具有此扩展名,对大小为0的数组进行解引用也会导致未定义的行为,并且您在此处执行此操作:

*this->arr1 = new char[4];

我不知道您的意图是什么,]

const char *arr1[4];

在这种情况下,*this->arr1 = new char[4];是不必要的或您想要的

const char **arr1;

在这种情况下,应该为this->arr1 = new char*[4];


您不应使用char*来管理字符串,而应使用std::string来为您进行内存管理。同样,对于多个字符串,请使用std::vector<std::string>而不是char**


似乎也没有任何理由在main中使用动态内存分配。与应该使用std::vector管理动态大小的对象数组而不是使用new[] / delete[]的方法相同,如果没有充分的理由,请不要使用动态内存分配来创建单个对象如果需要的话,请使用std::unique_ptr而不是原始的new / delete

int main()
{
    myclass my;
    my.run();

    return 0;
}

这无需动态分配即可完成。

© www.soinside.com 2019 - 2024. All rights reserved.