C++ 删除主新变量中的新变量

C++ 删除主新变量中的新变量,c++,new-operator,C++,New Operator,关于标题,我很抱歉。我不知道该叫什么名字。如果任何MOD正在阅读,并且他们理解问题,那么如果需要,请重命名 假设您创建了一个new变量(varOne) 在varOne代码中,其他变量创建为new(varTwo,varThree) 如果您在varOne上调用delete,varTwo和varThree会被删除吗,还是需要删除它们并删除varOne?您必须分别删除它们和删除varOne,但是实际上,varOne的构造函数应该分配这些变量,如果出于某种原因必须将它们放在堆上,析构函数应该释放它们。最好

关于标题,我很抱歉。我不知道该叫什么名字。如果任何MOD正在阅读,并且他们理解问题,那么如果需要,请重命名

假设您创建了一个
new
变量(varOne)

在varOne代码中,其他变量创建为
new
(varTwo,varThree)


如果您在varOne上调用delete,varTwo和varThree会被删除吗,还是需要删除它们并删除varOne?

您必须分别删除它们和删除
varOne
,但是实际上,
varOne
的构造函数应该分配这些变量,如果出于某种原因必须将它们放在堆上,析构函数应该释放它们。最好只按值存储它们,并永久删除
new
delete

您必须分别删除它们和删除
varOne
,但是实际上,
varOne
的构造函数应该分配这些变量,如果出于某种原因必须将它们放在堆上,析构函数应该释放它们。最好只按值存储它们,并永久地删除
new
delete

我不能100%确定您的意思,但一般来说,您分配给new的任何内容都必须单独处理delete


如果你在C++类的上下文中是这样的,你需要手动删除析构函数的瓦隆和VART2。< /P> < P>我不确定你的意思,但是一般来说,你用新的分配任何东西,你必须单独用Delaby.D/P>进行分配。


如果你在C++类的上下文中是这样的,你需要手动删除析构函数的瓦隆和VART2。

< P>你只需要删除VARD2和VALT3,因为当你从瓦隆的析构函数中掉出来时,用来调用VARONE的析构函数的删除将清理ValOne的实例。 换句话说,在下面的示例中,varOne是Foo,varTwo是m_i,varThre是m_c:

class Foo
{
public:
  Foo() : m_i( new int ), m_c( new char ) { }
  ~Foo() { delete m_i; delete m_c; }
  // don't forget to take care of copy constructor and assignment operator here!!!
private:
  int*  m_i;
  char* m_char;
};

main()
{
  Foo* p = new Foo;
  delete p;
}

另外,请确保在执行此操作时,遵循以下步骤,否则您的程序将出现内存问题。(换句话说,如果您在构造函数中进行内存分配,请确保覆盖或删除默认的复制构造函数和赋值运算符。

您只需要删除varTwo和varThree,因为当您脱离varOne的析构函数时,用于调用varOne的析构函数的delete将清除该varOne实例

换句话说,在下面的示例中,varOne是Foo,varTwo是m_i,varThre是m_c:

class Foo
{
public:
  Foo() : m_i( new int ), m_c( new char ) { }
  ~Foo() { delete m_i; delete m_c; }
  // don't forget to take care of copy constructor and assignment operator here!!!
private:
  int*  m_i;
  char* m_char;
};

main()
{
  Foo* p = new Foo;
  delete p;
}

另外,请确保在执行此操作时,遵循以下步骤,否则您的程序将出现内存问题。(换句话说,如果您在构造函数中进行内存分配,请确保覆盖或删除默认的复制构造函数和赋值运算符。

使用智能指针,并且永远不要删除自己代码中的任何内容

使用智能指针,永远不要删除自己代码中的任何内容

我不知道如何理解你的问题,因为你不是
new
一个变量(所有变量都是静态的、自动的或成员变量),而是对象(你从
new
得到的指针通常会被指定用于初始化变量,也许这就是你的意思?)。因此,我将给出一个一般性的回答,并希望包括您所要求的内容

首先,作为一项基本规则,您分配给
new
的每个对象都必须用
delete
显式解除分配。但是,<代码>删除<代码>可能隐藏在另一个对象中,如代码> > SistDeEXPPT/<代码> /<代码> UnQuyJPtR <代码>,从Boost或C++ 11,或 AutoPyTrp/代码>在C++版本中。 如果您的对象包含子对象,通常最好让它们成为直接成员,因此您根本不需要使用
new
来分配它们(事实上,这是C++中的一条通用规则:如果您不一定要动态分配,就不要这样做)。也就是说,你要把你的班级写成

class X
{
public:
  // ...
private:
  Type1 subobject1;
  Type2 subobject2:
};
而且根本不必为子对象处理
new
/
delete
。但是,如果需要动态分配对象,还必须删除它们,例如

class X
{
public:
  X()
  {
    subobject1 = new Type1();
    try
    {
      subobject2 = new Type2();
    }
    catch(...)
    {
      delete subobject1;
    }
  }
  ~X()
  {
    delete subobject2;
    delete subobject1;
  }
  // ...
private:
  X(X const&); // disabled
  X& operator=(X const&); // disabled
  Type1* subobject1;
  Type2* subobject2;
};
请注意
X
的构造函数中相当复杂的代码,以确保即使在出现异常的情况下也能正确清理对象。还需要注意的是,您还必须实现复制构造和赋值,或者通过使它们私有且未实现来禁用它们(请注意,C++11提供了特殊的语法
=delete
,以禁用它们)。通过使用智能指针,您可以省去很多麻烦(但您仍然需要注意复制构造和赋值,至少对于通常的智能指针是这样):

X类
{
公众:
X():
子对象1(新类型1()),
子对象2(新类型2())
{
}
私人:
X(X常量&)=delete;//已禁用
X&运算符=(X常量&)=delete;//已禁用
std::唯一的_ptr子对象1;
std::唯一的_ptr子对象2;
};

在这里,我使用了C++11的
unique\u ptr
(因此也使用了C++11语法来删除复制构造函数和赋值运算符)。请注意,在第一印象中,此代码似乎根本没有
delete
;然而,那些
delete
s实际上隐藏在
unique\u ptr
的析构函数中。还要注意,现在不再需要构造函数中的显式异常处理;由于删除是在
unique_ptr
s的析构函数中完成的,C++的构造函数异常处理规则会自动处理这个问题。

我不知道如何理解你的问题,因为你不是
new
变量(所有变量都是静态、自动或成员变量),而是对象(你从
new
中得到的指针通常会被指定用于初始化变量,也许这就是你的意思?)