我正在实现类my_unique_ptr
和my_shared_ptr
,它们模拟了标准库的智能指针std::unique_ptr
和std::shared_ptr
,以便更好地了解它们。
当我实现析构函数时,我在纠结是使用delete
还是delete[]
来释放内存。尽管我在SO和其他网站上阅读了很多内容,但没有一种便携式的方法可以知道由new[]
分配了多少字节(或者是否使用了new
或new[]
)(How many bytes were allocated by new?)。
在实现类my_unique_ptr
时,我无法知道用户将从构造函数请求多少字节,即:
他会做 my_unique_ptr<int> ptr1(new int)
或者他会做my_unique_ptr<int> ptr1(new int[5])
如果有办法,请让我知道!
这是我的类(简化并省略了复制/移动构造函数):
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[]
”。但是,我该如何在我的类中编写代码,以使其始终匹配正确的操作符呢?
附注:
在我的构造函数中,使用 delete
而不是delete[]
,同时传递超过1个 int
(例如使用 new int[5]
),使用 valgrind
运行时,Valgrind会显示所有内存块都被释放了,没有泄漏的机会! (尽管显示警告,例如 mismatched new[] with delete
)。这是否意味着delete
成功释放了由new[]
分配的所有5个int
? 请帮忙解答。
我使用的操作系统是Ubuntu 18.04
,使用的编译器是gcc 7.5.0
。
my_unique_ptr<T[]>
,然后要求用户使用my_unique_ptr<int[]> ptr1(new int[5]);
。这就是标准库智能指针所做的。 - cdhowie