这可能是一个简单的问题,但我有这个模板类:
template<typename Type> class Array { size_t n; Type* buff; public: Array(size_t n_): n(n_),buff(new Type[n]) {} };
代码来自课程pdf文件,其中说buff(new Type [n])不安全.我不明白为什么它是不安全的,是不是size_t一般没有签名?我可以有一个例子,它可能有一个编译和/或运行时错误?
解决方法
@H_403_9@ 代码是“不安全”的事实,它依赖于在buff之前构造n.这种依赖关系增加了脆弱性.当构造类的成员时,它们按照在类中声明的顺序构造,而不是在成员初始化列表中调用它们,所以如果代码被更改为
template<typename Type> class Array { Type* buff; size_t n; public: Array(size_t n_): n(n_),buff(new Type[n]) {} };
那么当你做了buff(new Type [n]),n是未初始化的,你有未定义的行为.