当前位置: 首页 > 知识库问答 >
问题:

vector::emplace_back结果调用析构函数两次

羊越
2023-03-14

简单程序写成:

#include <iostream>
#include <vector>
using std::vector;

class Test {
public:
    Test( int d ) : data(d), addr(&data) {

    }
    // Test( Test &src ) : data(src.data), addr(src.addr) { }
    const int data;
    const int *addr;
    ~Test() {
        delete addr;
    }
    void print() {
        std::cout << " Data is : " << data << '\n';
    }
};

int main( int, char**, char** ) {

    std::vector<Test> data1;
    data1.emplace_back( 98 );

    for( auto a : data1 )
        a.print();
    std::cout << "main";
    std::cout << std::endl;
    return 0;
}

可能原因是析构函数调用了两次,我试图从这里和那里得到一些信息,但无法得到清晰的视图。

共有1个答案

任元青
2023-03-14

正如所评论的,问题是析构函数中的delete语句,这对于非动态数据成员是不需要的。

 类似资料:
  • 我是新的反应,我试图用它开发一个简单的网络应用程序,但我得到了一个错误。当我加载一个类组件时,我的构造函数被调用两次,你能帮忙吗? 原木地被击中两次。在一些组件中,我希望进行一个命中DB的API调用,但我只想命中它一次。在许多情况下,使用并不方便,因为道具只出现在之后,因此我想在中调用(我不会使用setState,这会导致重新加载render)。 提前感谢

  • 构造函数与析构函数是自动调用的。这些函数的调用顺序取决于执行过程进入和离开实例化对象范围的顺序。一般来说,析构函数的调用顺序与构造函数相反。但图6.9将介绍对象存储类可以改变析构函数的调用顺序。 全局范围中定义的对象的构造函数在文件中的任何其他函数(包括 main)执行之前调用(但不同文件之间全局对象构造函数的执行顺序是不确定的)。当main终止或调用exit函数时(见第18章)调用相应的析构函数

  • 本文向大家介绍c++ vector 常用函数示例解析,包括了c++ vector 常用函数示例解析的使用技巧和注意事项,需要的朋友参考一下 c++ vector 常用函数 Just like arrays, vectors use contiguous storage locations for their elements, which means that their elements can

  • 我有一个帖子列表,我试图在构造函数或componentDidMount中为每个帖子调用一个操作。但不知何故,当我发送一个新消息时,构造函数和componentDidMount函数会被调用两次。 当从列表中读取帖子时,这些函数仅被调用一次。但是当我发送一条新消息时,他们会被呼叫两次。 我怎样才能避免这种情况。我试着像这样使用ComponendDupDate函数:

  • 我的react组件的构造函数被调用了两次,但我不知道为什么。我正在使用react redux存储我的应用程序的语言。我有一个基于浏览器语言设置默认语言的函数。LoginPage是第一个获得render的组件,因此我在其构造函数中调用了我的函数。基本上,它所做的就是比较并分派一个动作。当我用redux开发工具检查我的状态时,我看到它被调度了两次。我在构造函数中打印了虚拟数据,它也打印了两次。 登录页

  • 基本问题:程序何时在C中调用类的析构函数方法?有人告诉我,每当对象超出范围或受到时都会调用它 更具体的问题: 1)如果对象是通过指针创建的,并且该指针后来被删除或给定一个新的地址来指向,它所指向的对象是否调用其析构函数(假设没有其他东西指向它)? 2) 接下来是问题1,什么定义了对象何时超出范围(与对象何时离开给定的{block}无关)。换句话说,什么时候对链表中的对象调用析构函数? 3) 你想手

  • 问题内容: 对于以下C代码: 对于Win32,我得到以下反汇编: 对于Linux32: 我试图了解呼叫后呼叫者的行为方式的差异。为什么Linux32中的调用程序会执行这些额外的操作? 我假设两个目标都将遵循cdecl调用约定。cdecl不会为返回结构的函数定义调用约定吗? 编辑: 我添加了被调用者的实现。可以肯定的是,您可以看到Linux32被调用方会弹出其参数,而Win32被调用方不会: Win

  • 本文向大家介绍C++中构造函数与析构函数的调用顺序详解,包括了C++中构造函数与析构函数的调用顺序详解的使用技巧和注意事项,需要的朋友参考一下 前言 在使用构造函数和析构函数时,需要特别注意对它们的调用时间和调用顺序。在一般情况下,调用析构函数的次序正好与调用构造函数的次序相反:最先被调用的构造函数,其对应的(同一对象中的)析构函数最后被调用,而最后被调用的构造函数,其对应的析构函数最先被调用。