向量擦除调用的错误析构函数

伊曼纽尔·帕瓦内洛(Emanuele Pavanello)

我有一些物体的向量。我注意到,当我使用擦除方法从向量中删除一个元素时,我得到了对错误元素(总是到最后一个元素)的析构函数调用。这是产生不良输出的最小示例。

// Example program
#include <iostream>
#include <string>
#include <vector>

using namespace std;

class Test {
    public:
        Test(string value) {
            _value = value;
            cout << "Constructor:" << _value << endl;
        }
        Test(const Test &t) {
            _value = t._value;
            cout << "Copied:" << _value << endl;
        }
        ~Test() {
            cout << "Destructor:" << _value << endl;
        }
        string print() {
            return _value;
        }
        string _value;
};

int main()
{
    vector<Test> vec;
    vec.reserve(3);
    cout << "Creation" << endl << endl;
    vec.push_back(Test("1"));
    vec.push_back(Test("2"));
    vec.push_back(Test("3"));

    cout << endl << "Deleting" << endl << endl;

    vec.erase(vec.begin());     // Here is called the element with value "3"
    vec.erase(vec.begin());     // Here is called the element with value "3"

    cout << endl << "Log" << endl << endl;

    // But the final log print "3"
    for (unsigned i = 0; i < vec.size(); i++) {
        cout << vec[i].print()<<endl;
    }

    return 0;
}

输出为:

Creation

Constructor:1
Copied:1
Destructor:1
Constructor:2
Copied:2
Destructor:2
Constructor:3
Copied:3
Destructor:3

Deleting

Destructor:3         <-- WRONG, NEED TO BE 1
Destructor:3         <-- WRONG, NEED TO BE 2

Log

3
Destructor:3

我将解决此问题而无需更改容器向量。

昆汀

vec.erase(vec.begin());没有破坏的第一要素。它通过使用move-or或copy-assignment运算符将所有后续位移动一位,从而将其覆盖。从中移出最后一个元素后剩下的东西将被销毁,这就是您要观察的内容。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

析构函数在C ++中调用向量

来自分类Dev

从析构函数调用线程的向量

来自分类Dev

C ++:调用了错误的析构函数

来自分类Dev

调用错误的析构函数

来自分类Dev

析构函数调用

来自分类Dev

如果析构函数用于向量中的对象,是否将调用该析构函数?

来自分类Dev

智能指针析构函数调用的向量

来自分类Dev

从析构函数调用BeginInvoke

来自分类Dev

C++ 析构函数调用了错误的对象?

来自分类Dev

std:map析构函数会调用键析构函数还是值析构函数?

来自分类Dev

推入C ++向量时的构造函数和析构函数调用

来自分类Dev

如何在不调用析构函数的情况下使向量重新分配?

来自分类Dev

C ++中的析构函数直接调用

来自分类Dev

避免析构函数调用特定异常

来自分类Dev

范围结束之前调用的析构函数

来自分类Dev

delete []是否调用析构函数?

来自分类Dev

使用delete调用析构函数

来自分类Dev

析构函数调用和指针

来自分类Dev

线程多次调用析构函数

来自分类Dev

调用析构函数时出错

来自分类Dev

析构函数的调用量超出预期

来自分类Dev

显式调用析构函数

来自分类Dev

从列表中调用元素的析构函数

来自分类Dev

关于析构函数调用的困惑

来自分类Dev

手动调用析构函数

来自分类Dev

如何指定析构函数调用的顺序?

来自分类Dev

析构函数调用和指针

来自分类Dev

析构函数未正确调用

来自分类Dev

显式调用析构函数