如果创建两个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
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; }
这无需动态分配即可完成。