这可能是一个简单的问题,但我有这个template class:
template<typename Type>
class Array {
size_t n;
Type* buff;
public:
Array(size_t n_): n(n_), buff(new Type[n]) {}
};
Run Code Online (Sandbox Code Playgroud)
该代码来自课程pdf文件,其中说它buff(new Type[n])不安全.我不明白为什么它不安全,是不是size_t一般都没有签名?我可以举例说明它可能有编译和/或运行时错误吗?
Nat*_*ica 12
代码是"不安全的",因为它依赖于n以前构造buff.这种依赖性增加了代码的脆弱性.
构造类的成员时,它们按照在类中声明的顺序构造,而不是在成员初始化列表中调用它们的方式,因此如果代码更改为
template<typename Type>
class Array {
Type* buff;
size_t n;
public:
Array(size_t n_): n(n_), buff(new Type[n]) {}
};
Run Code Online (Sandbox Code Playgroud)
然后当你这样做时buff(new Type[n]),n是未初始化的,你有未定义的行为.