【发布时间】:2020-10-14 06:42:39
【问题描述】:
我正在实现类 my_unique_ptr 和 my_shared_ptr,它们模仿标准库智能指针 std::unique_ptr 和 std::shared_ptr,以便更好地了解它。
在实现析构函数时,我很难决定是使用delete 还是delete[] 来释放内存。就我在 SO 和其他网站上阅读的内容而言,没有可移植的方式知道new[] 分配了多少字节(或者是使用了new 还是new[])(@987654321 @)
在实现类my_unique_ptr时,我无法知道用户将从构造函数请求多少字节,即
他会不会做my_unique_ptr<int> ptr1(new int)
或者他会做
my_unique_ptr<int> ptr1(new int[5])
如果有办法请告诉我!
这是我的类(简化且没有 cpy/move 构造函数):
template<typename ValueType>
class my_unique_ptr {
ValueType *internal_ptr = nullptr;
public:
// Default constructor
my_unique_ptr() {
internal_ptr = nullptr;
}
// Paramterized constructor
explicit my_unique_ptr(ValueType *ptr) {
if (ptr)
internal_ptr = ptr;
}
// Destructor
~my_unique_ptr() {
// How do I know whether to use
delete ptr;
// or
delete[] ptr;
}
我在某处读到编译器跟踪new[] 的参数,然后delete[] 使用该参数来正确释放内存。另请阅读“程序员有责任将new 与delete 和new[] 与delete[] 匹配”。但是我如何在我的班级中对此进行编程,以使其始终匹配正确的运算符?
旁注:
运行valgrind,同时在任何地方使用delete而不是delete[],并在我的构造函数中传递超过1个int(比如new int[5]),Valgrind说所有内存块都被释放了,没有机会泄漏! (虽然显示像mismatched new[] with delete 这样的警告。这是否意味着delete 正在成功释放new[] 分配的所有5 个ints?请帮助。
我在Ubuntu 18.04 并使用gcc 7.5.0。
【问题讨论】:
-
最简单的就是专门化
my_unique_ptr<T[]>,然后要求用户使用my_unique_ptr<int[]> ptr1(new int[5]);。这就是标准库智能指针的作用。 -
@cdhowie 我明白了,谢谢!
-
@cdhowie 有趣的是,一旦你用你的回复摧毁他们,这里的每个人都会删除他们的答案xD
-
@SirajQazi 大声笑我得到了类似的回复,但是,我的也是有效的解决方案!所以我不会删除那个..
-
@K.R.Park 哈哈当然,也谢谢你回答我的问题:)
标签: c++ memory-management new-operator smart-pointers delete-operator