gpt4 book ai didi

c++ - 使用 int 和对象的模板删除对象

转载 作者:行者123 更新时间:2023-11-30 02:59:15 25 4
gpt4 key购买 nike

好吧,假设我有一个包含所有定义的类,bla bla bla ...

template <class DT>
class Foo{
private:
DT* _data;
//other stuff;
public:
Foo(DT* data){ _data = data; }
virtual ~Foo(){ delete _data; }
//other methods
};

然后我在 main 方法中有:

int main(){
int number = 12;

Foo<anyRandomClass>* noPrimitiveDataObject = new Foo<anyRandomClass>(new anyRandomClass());
Foo<int>* intObject = new Foo<int>(number);

delete noPrimitiveDataObject; //Everything goes just fine.
delete intObject; //It messes up here, I think because primitive data types such as int are allocated in a different way.

return 0;
}

我的问题是:我该怎么做才能让 main 方法中的两个 delete 语句正常工作?

P.S.:虽然我没有实际编译/测试过这段特定的代码,但我已经对其进行了广泛的审查(以及缩进),所以如果您发现错误,请多多包涵。

最佳答案

您正在获取文字的地址,然后调用 delete稍后就可以了,这是错误的。它没有分配 new ,因此您不能使用 delete 解除分配它(也没有任何意义)。

如果你写了new int(12)相反,它会好的,但是,还有其他问题。

首先,你的类违反了The Rule of Three .如果我复制 intObject 会发生什么然后调用delete在他们两个?你最终调用 delete在同一个指针上两次。

第二,为什么一开始要动态分配这些东西?您创建一个 RAII 风格的包装器来为您处理释放……然后继续手动分配它。解决什么问题?

我想这对您来说是一个练习,这很好。请记住您要使用此代码解决什么问题。

如果我使用 std::vector<T>我当然不会这样使用它:

std::vector<int> *v = new std::vector<int>;

它违背了使用 vector 的全部目的!现在我必须手动管理这个指针/内存,这就是创建 vector 类(和其他 RAII 样式类)要解决的问题。

因此,要正确使用它,您可以这样做:

void foo() 
{
std::vector<int> v;
// do stuff with v
// it allocates its memory dynamically so you don't have to.
// when we exit the function the destructor is called, the memory
// deallocated, and life continues as it should.
}

使用自动存储期限对您有利,这就是重点。还要非常清楚谁拥有内存。如果从您的类设计中不清楚谁拥有给定的内存块,那么 delete 是不安全的它在你的析构函数中。


好的,您现在将代码更改为:

int number = 12;
// ...
Foo<int>* intObject = new Foo<int>(number);

同样的问题;您正在获取分配有自动存储持续时间的变量的地址,然后调用 delete在上面。 这是错误的。你用 new 分配的任何东西你用 delete 解除分配, 但没有别的。曾经。就是这样。

关于c++ - 使用 int 和对象的模板删除对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13058995/

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