【发布时间】:2020-12-19 21:45:08
【问题描述】:
当我意识到以下代码编译并成功运行时,我正在通过重新创建基本的std::unique_ptr 来尝试模板特化:
namespace not_std {
template<typename T>
class unique_ptr
{
public:
unique_ptr(T *pointer)
: pointer_(pointer)
{ }
~unique_ptr()
{
delete pointer_;
}
private:
T *pointer_;
};
template<typename T>
class unique_ptr<T[]>
{
public:
unique_ptr(T *pointer)
: pointer_(pointer)
{ }
~unique_ptr()
{
delete[] pointer_;
}
private:
T *pointer_;
};
} // namespace not_std
int main()
{
not_std::unique_ptr<char[]> buffer(char[64]);
}
请注意,我不是在寻找有关实现的反馈,因此我已经删除了类定义中不相关的部分。
起初我以为这是我的实现中的一个错误,但事实证明,即使使用标准实现,这段代码也能编译并运行。
我认为这段代码会中断,因为char[64] 在我看来就像一个匿名堆栈分配数组。如果是这种情况,那么它的生命周期会在 std::unique_ptr 的构造函数返回时结束。那么析构函数不会在现在也超出范围的堆栈分配内存上调用delete[] 吗?
也许我误解了到底发生了什么,因为我以前从未见过这种语法,其中数组T[N] 直接作为参数传递。
感谢任何澄清/解释。
【问题讨论】: