【发布时间】:2017-05-19 22:49:55
【问题描述】:
我认为a[] 和*a 是同一个东西,因为它们的工作方式类似于指针。然而我在下面的代码中遇到了一些意想不到的东西:
#include <iostream>
using namespace std;
class F {
public:
bool a[];
F();
};
F::F() {
*a = new bool[5];
a[2] = true;
}
int main() {
F obj;
if(obj.a[2])
cout << '?';
return 0;
}
这段代码打印?,但我不明白它是如何工作的。时间:
*a = new bool[5];
改为:
a = new bool[5];
编译器报告:
F:\main.cpp|11|error: incompatible types in assignment of 'bool*' to 'bool [0]'|
我发现这种行为很奇怪,所以我在玩这个代码。当我把a的类型从bool改成int编译器总是报错
F:\main.cpp|11|error: invalid conversion from 'int*' to 'int' [-fpermissive]|
为什么会这样?
【问题讨论】:
-
bool a[];作为成员是编译器扩展,而不是标准 C++。你不使用std::vector有什么原因吗? -
@TartanLlama 也许他喜欢他的内存泄漏;)
-
当你写new时,它是在堆上创建一个指向bool数组的指针。由于a本身就是数组,所以*a是bool数组指针的正确等价。
-
@TartanLlama 我不太擅长 STL,所以我尝试使用默认数据类型。
-
@MarkoDivjak 你忘记了释放你的数组的析构函数
new[]。