gpt4 book ai didi

c++ - 显式析构函数

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:20:57 27 4
gpt4 key购买 nike

下面的代码只是用来说明我的问题。

template<class T>
class array<T>
{
public:
// constructor
array(cap = 10):capacity(cap)
{element = new T [capacity]; size =0;}

// destructor
~array(){delete [] element;}
void erase(int i);
private:
T *element;
int capacity;
int size;
};



template<class T>
void class array<T>::erase(int i){
// copy
// destruct object
element[i].~T(); ////
// other codes
}

如果我有array<string> arr在 main.cpp 中。当我使用 erase(5) , element[5] 的对象被破坏但element[5]的空间不会被释放,我可以只使用 element[5] = "abc" 吗?把一个新的值(value)放在这里?或者我是否应该使用 placement new 将新值放入 element [5] 的空间中?

当程序结束时,arr<string>将调用它自己的析构函数,它也调用 delete [] element .所以string的析构函数会先运行销毁对象,然后释放空间。但是因为我已经明确地破坏了 element[5] ,析构函数(由 arr 的析构函数调用)运行两次以析构 element[5] 是否重要? ?我知道空间不能被释放两次,对象呢?我做了一些测试,发现如果我只破坏对象两次而不是两次释放空间似乎没问题。

更新

答案是:

(1)I have to use placement new if I explicitly call destructor.

(2) repeatedly destructing object is defined as undefined behavior which may be accepted in most systems but should try to avoid this practice.

最佳答案

您需要使用 placement-new 语法:

new (element + 5) string("abc");

element[5] = "abc" 是不正确的;这将调用 operator=element[5] ,这不是有效对象,会产生未定义的行为。

When program ends, the arr<string> will call its own destructor which also calls delete [] element.

这是错误的:您将最终调用其析构函数已被调用的对象的析构函数(例如,上述示例中的 elements[5])。这也会产生未定义的行为。

考虑使用 std::allocator及其界面。它使您可以轻松地将分配与构造分开。它由 C++ 标准库容器使用。

关于c++ - 显式析构函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4893817/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com