C++ 使用int和object的模板删除对象

C++ 使用int和object的模板删除对象,c++,delete-operator,C++,Delete Operator,好吧,假设我有一个类,有它所有的定义,等等等等 template <class DT> class Foo{ private: DT* _data; //other stuff; public: Foo(DT* data){ _data = data; } virtual ~Foo(){ delete _data; } //other methods }; 模板 福班{ 私人: DT*_数据; //其他东西; 公众: Foo(DT*data)

好吧,假设我有一个类,有它所有的定义,等等等等

template <class DT>
class Foo{
private:
    DT* _data;
    //other stuff;
public:
    Foo(DT* data){ _data = data; }
    virtual ~Foo(){ delete _data; }
    //other methods
};
模板
福班{
私人:
DT*_数据;
//其他东西;
公众:
Foo(DT*data){u data=data;}
virtual~Foo(){delete_data;}
//其他方法
};
然后我在主要方法中:

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;
}
intmain(){
整数=12;
Foo*noPrimitiveDataObject=new Foo(new anyRandomClass());
Foo*intObject=新的Foo(编号);
删除noPrimitiveDataObject;//一切正常。
delete-intObject;//我想这是因为int等基本数据类型是以不同的方式分配的。
返回0;
}
我的问题是:我该怎么做才能让main方法中的两个delete语句都正常工作


注:虽然我没有实际编译/测试这段特定的代码,但我已经对它进行了广泛的审查(以及缩进),所以如果你发现了错误,请小心

好像你不知道你可以做
newint(12)
。例如,您可以将代码更改为以下内容:

Foo<int>* intObject = new Foo<int>(new int(12));
Foo(DT* data){ _data = data; }
virtual ~Foo(){ delete _data; }
旁注


在发布问题之前,至少试着编译你的示例。

你获取了一个文本的地址,然后稍后调用
delete
,这是错误的。它没有分配给
new
,因此您不能用
delete
解除分配它(这样做也没有任何意义)

如果您编写了
newint(12)
,那么就可以了,不过,还有其他问题

首先,您的类违反了。如果我将
复制到object
中,然后对这两个对象调用
delete
,会发生什么情况?最后在同一个指针上调用了两次
delete

其次,为什么一开始就要动态地分配这些东西?您创建了一个RAII样式的包装器来为您处理释放。。。然后继续手动分配。这解决了什么问题

我想这对你来说是一种锻炼,这很好。只需记住您试图用此代码解决的问题

如果我使用的是
std::vector
,我肯定不会这样使用它:

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

同样的问题;您正在获取分配有自动存储持续时间的变量的地址,然后对其调用
delete
这是错误的。使用
new
分配的任何内容都可以取消分配
delete
,但除此之外没有其他内容。曾经就是这样。

是为了学习,是的。我需要为一个更大的项目解决这个问题。我明白你的意思了,这实际上是可行的。我试试看。谢谢,修正了密码,谢谢。我们的目的是要传递原始对象,但我认为如果不这样做,问题不会有多大改变。@Yokhen:如果您打算在生产代码中使用此方法,而其他人实际上会使用此方法,那么您还有一些问题需要解决。我知道这是错误的。非常感谢。这就是我提出这个问题的原因。我只是修改了代码以使其更清晰。我会使用
std::vector
,但我的教授不允许我们使用它,因此我必须解决
std::vector
不存在的问题。我也是这样做的,因为我有一个更大的程序来测试我正在创建的数据结构,它遇到了这个问题。这个数据结构包含一个元素数组,可以是int,也可以是任何对象,而且正如您可能意识到的,元素不是一次添加或删除的。@Yokhen:我只是使用了
std::vector
作为示例。您试图实现的是一种模式,称为。但是,您的实现存在一些问题,在许多情况下都会导致错误。我知道你来这里是为了学习,所以我回答:)
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.
}
int number = 12;
// ...
Foo<int>* intObject = new Foo<int>(number);