Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.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# C+中的构造函数和析构函数+;与C相比#_C#_C++_Constructor_Destructor_Temporary Objects - Fatal编程技术网

C# C+中的构造函数和析构函数+;与C相比#

C# C+中的构造函数和析构函数+;与C相比#,c#,c++,constructor,destructor,temporary-objects,C#,C++,Constructor,Destructor,Temporary Objects,我希望下面的代码创建类“test”的5个对象,每次创建一个对象时调用构造函数,将它们存储在向量中,打印“lala”一次,然后运行析构函数并销毁创建的对象。我希望析构函数为我创建的每个对象运行一次,但不要超过一次 我认为C++在下面的示例中创建了多个不想要的对象的副本,否则它会调用析构函数的方式。我不确定。试过gcc和叮当没有区别。尝试了堆栈和堆分配,以及std::move。所有这些都会产生相同的结果,比我要求的更多的析构函数调用 我注意到,在打印“LalaLa”之前,有一些但不是所有的C++析构

我希望下面的代码创建类“test”的5个对象,每次创建一个对象时调用构造函数,将它们存储在向量中,打印“lala”一次,然后运行析构函数并销毁创建的对象。我希望析构函数为我创建的每个对象运行一次,但不要超过一次

我认为C++在下面的示例中创建了多个不想要的对象的副本,否则它会调用析构函数的方式。我不确定。试过gcc和叮当没有区别。尝试了堆栈和堆分配,以及std::move。所有这些都会产生相同的结果,比我要求的更多的析构函数调用

我注意到,在打印“LalaLa”之前,有一些但不是所有的C++析构函数被调用。 为什么这个C++代码运行析构函数17次:

#include <iostream>
#include <vector>

using namespace std;


class test
{
public:
    int t;
    test(int i)
    {
        t = i;
        cout << "Created instance " << t << ". \n";
    }
    ~test()
    {
        cout << "(*)Deleted instance " <<  t <<  ".\n";
    }
};

int main()
{
    vector <test> V;

    for(int i = 1; i <= 5; i++)
    {
        test D(i);
        V.push_back(D);
    }
   cout << "LALALLALA \n";
   return 0;
}
#包括
#包括
使用名称空间std;
课堂测试
{
公众:
int t;
测试(int i)
{
t=i;

C++中缺失的拷贝构造函数增加了报告构造函数调用数和析构函数调用之间的不匹配。创建了很多拷贝(依赖于编译器执行/允许的优化)。

请注意,您正在比较苹果和橙子(两次):

    <> > P> C++对象是默认值类型,C类是引用类型(C值类型-<代码>结构> <代码>不能有析构函数),因此如果C++代码使用指针插入到某种智能指针中(这样也避免了丢失拷贝构造函数的问题),则会得到相同的行为。

  • C++析构函数是同步的,而C#“析构函数”是异步的,可能永远不会运行(与C++相比,当对象“超出范围”时肯定不会运行)


C++中的缺失拷贝构造函数增加了报告构造函数调用数和析构函数调用之间的不匹配。创建了很多副本(数量取决于编译器执行/允许的优化)。

请注意,您正在比较苹果和橙子(两次):

    <> > P> C++对象是默认值类型,C类是引用类型(C值类型-<代码>结构> <代码>不能有析构函数),因此如果C++代码使用指针插入到某种智能指针中(这样也避免了丢失拷贝构造函数的问题),则会得到相同的行为。

  • C++析构函数是同步的,而C#“析构函数”是异步的,可能永远不会运行(与C++相比,当对象“超出范围”时肯定不会运行)

在C语言中,你的列表存储了对对象的引用。在C++中,你实际上是在向量中存储对象。这意味着它们在被放入向量时需要被复制,并且当向量需要重新分配时。这些副本中的每一个都是单独的对象(用复制构造器创建,而不是跟踪)。,并将调用析构函数

< > C++中对C++所做的一个很接近的近似是将指针(或智能指针)存储到堆分配的测试对象中,而不是测试对象本身

#include <memory> // for shared_ptr

int main()
{
    std::vector<std::shared_ptr<test>> V;

    for(int i = 1; i <= 5; i++)
    {
        auto D = std::make_shared<test>(i);
        V.push_back(D);
    }
    std::cout << "LALALLALA \n";
    return 0;
}
#包括//用于共享的ptr
int main()
{
std::向量V;
对于(int i=1;i),在C语言中,你的列表存储了对对象的引用。在C++中,你实际上是在向量中存储对象。这意味着它们在被放入向量时需要被复制,并且当向量需要重新分配时。这些副本中的每一个都是单独的对象(用复制构造器创建,而不是跟踪)。,并将调用析构函数

< > C++中对C++所做的一个很接近的近似是将指针(或智能指针)存储到堆分配的测试对象中,而不是测试对象本身

#include <memory> // for shared_ptr

int main()
{
    std::vector<std::shared_ptr<test>> V;

    for(int i = 1; i <= 5; i++)
    {
        auto D = std::make_shared<test>(i);
        V.push_back(D);
    }
    std::cout << "LALALLALA \n";
    return 0;
}
#包括//用于共享的ptr
int main()
{
std::向量V;

对于(int i=1;i),您还需要count copy构造函数。解释可能有帮助您也需要count copy构造函数。解释可能有帮助
int main()
{
    std::vector<test> V;

    // ensure we can store 5 objects without reallocating
    V.reserve(5);

    for(int i = 1; i <= 5; i++)
    {
        // construct the object in place in the vector
        V.emplace_back(i);
    }
    std::cout << "LALALLALA \n";
    return 0;
}