Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我应该释放析构函数中的所有成员(它们是动态分配的)吗? #包括 #包括 使用名称空间std; #定义l(x)cout_C++_Dynamic Memory Allocation - Fatal编程技术网

C++ 我应该释放析构函数中的所有成员(它们是动态分配的)吗? #包括 #包括 使用名称空间std; #定义l(x)cout

C++ 我应该释放析构函数中的所有成员(它们是动态分配的)吗? #包括 #包括 使用名称空间std; #定义l(x)cout,c++,dynamic-memory-allocation,C++,Dynamic Memory Allocation,如果我在类中使用动态分配的数组,我应该在解构器中释放它们吗 如果您的类分配内存,那么您的类应该取消分配内存。如果动态数组类分配内存,则该动态数组类应取消分配内存 解构器自然将其成员的解构器称为默认解构器。此执行是否释放了动态分配的内存 让我们看看std::vector的析构函数的引用是怎么说的: 破坏容器。调用元素的析构函数并释放已使用的存储 事实证明,是的,内存确实被释放了。这是一个很好的容器设计 我应该在类的解构器中调用成员向量的解构器吗?(请参见args.~vector();//我应该这

如果我在类中使用动态分配的数组,我应该在解构器中释放它们吗

如果您的类分配内存,那么您的类应该取消分配内存。如果动态数组类分配内存,则该动态数组类应取消分配内存

解构器自然将其成员的解构器称为默认解构器。此执行是否释放了动态分配的内存

让我们看看
std::vector
的析构函数的引用是怎么说的:

破坏容器。调用元素的析构函数并释放已使用的存储

事实证明,是的,内存确实被释放了。这是一个很好的容器设计


我应该在类的解构器中调用成员向量的解构器吗?(请参见args.~vector();//我应该这样做吗?这样做对吗?)

不,你不应该,这是不对的。因为——正如你所说——“解构器将其成员的解构器称为默认值”。要澄清的是,在析构函数的主体被执行之后,成员总是被销毁。如果还调用析构函数体中某个成员的析构函数,则该析构函数将被调用两次,这是非常糟糕的

隐式析构函数是正确的,对于类来说已经足够了。您不需要显式地定义它

几乎不需要显式调用析构函数。销毁超级对象时,会自动调用基本子对象和成员的析构函数。数组元素的析构函数在数组被销毁时自动调用。当自动对象超出范围时,会自动调用自动对象的析构函数。动态对象的析构函数在
delete
表达式中自动调用。在
main
函数返回后发生的静态销毁过程中,会自动调用静态对象的析构函数。在所有这些情况下都不需要显式调用析构函数

唯一需要显式调用析构函数的情况是在对象存储被其他对象重用的情况下,这是一种您还不需要学习的高级技术

如果我在类中使用动态分配的数组,我应该在解构器中释放它们吗

如果您的类分配内存,那么您的类应该取消分配内存。如果动态数组类分配内存,则该动态数组类应取消分配内存

解构器自然将其成员的解构器称为默认解构器。此执行是否释放了动态分配的内存

让我们看看
std::vector
的析构函数的引用是怎么说的:

破坏容器。调用元素的析构函数并释放已使用的存储

事实证明,是的,内存确实被释放了。这是一个很好的容器设计


我应该在类的解构器中调用成员向量的解构器吗?(请参见args.~vector();//我应该这样做吗?这样做对吗?)

不,你不应该,这是不对的。因为——正如你所说——“解构器将其成员的解构器称为默认值”。要澄清的是,在析构函数的主体被执行之后,成员总是被销毁。如果还调用析构函数体中某个成员的析构函数,则该析构函数将被调用两次,这是非常糟糕的

隐式析构函数是正确的,对于类来说已经足够了。您不需要显式地定义它

几乎不需要显式调用析构函数。销毁超级对象时,会自动调用基本子对象和成员的析构函数。数组元素的析构函数在数组被销毁时自动调用。当自动对象超出范围时,会自动调用自动对象的析构函数。动态对象的析构函数在
delete
表达式中自动调用。在
main
函数返回后发生的静态销毁过程中,会自动调用静态对象的析构函数。在所有这些情况下都不需要显式调用析构函数


唯一需要显式调用析构函数的情况是在对象存储被其他对象重用的情况下,这是一种高级技术,您还不需要学习。

类中没有任何内容是显式动态分配的(向量与动态分配的数组不同;它是一个类似于自我管理数组的东西,因此它会在自身之后进行清理)。这里没有要销毁的内容;默认的析构函数就可以了。deconstructor--这个词是destructor,而不是deconstructor。我应该在类的deconstructor中调用member vector的deconstructor吗?--你不仅不应该在析构函数中这样做,而且不应该在任何地方这样做,除非你正在使用
placement new
。不要尝试t手动呼叫destructors@ShadowRanger谢谢!你的意思是我不必调用向量的解构器吗?然后类粒子会自动调用~vector吗?你的类中没有任何东西是显式动态分配的(向量与动态分配的数组不同;它是一个类似于自我管理数组的东西,因此它会在自身之后进行清理)。这里没有要销毁的内容;默认的析构函数就可以了。deconstructor--这个词是destructor,而不是deconstructor。我应该在类的deconstructor中调用member vector的deconstructor吗?--你不仅不应该在析构函数中这样做,而且不应该在任何地方这样做,除非你正在使用
placement new
。不要尝试t手动呼叫destructors@ShadowRanger谢谢!你的意思是我不需要调用向量的解构器吗?还有
#include <iostream>
#include <vector>
using namespace std;
#define l(x) cout << (#x) << " : " << x << endl;
#define forf(x, fromY, Step, toZ) for(double x = fromY; x <= toZ; x+=Step)

class Particle {
public:
    Particle() {
        totalYield = winRate = 0;
    }
    ~Particle() {
        //cout << " Particle destructor were called";
        args.~vector();
    }
    Particle(double* inputArgs, int nSize) 
    :args(nSize)
    {
        for (int i = 0; i < nSize; i++) {
            args[i] = inputArgs[i];
        }
        totalYield = winRate = 0;
    }
    double GetAt(int i = 0) {
        return args[i];
    }

protected:
    double winRate, totalYield;
    unsigned int winCount, totalCount;
    vector<double> args;
};