对象和指针的 C++ vector

标签 c++ pointers vector

这是一个人为的例子,说明了我遇到的一个问题。基本上,我创建一个对象 vector ,然后创建一个指向对象的指针 vector ,然后打印指针和取消引用的对象。

#include <vector>
#include <iostream>

using namespace std;

namespace {
    struct MyClass {
        int* MyInt;
        MyClass(int* i) : MyInt(i) {}
    };

    struct MyBigClass {
        vector<MyClass> AllMyClassRecords;  // Where I keep the MyClass instances
        vector<int> TheInts;

        void loadMyClasses();
        void readMyClasses();
        MyBigClass() {}
    };

}

void MyBigClass::loadMyClasses() {
    for (int i = 0; i < 10; ++i) {
        TheInts.push_back(i);   // Create an int
        int *j = &TheInts[TheInts.size() - 1];  // Create a pointer to the new int
        AllMyClassRecords.push_back(MyClass(j));    // Create a MyClass using pointer
    }
}

void MyBigClass::readMyClasses() {
    for (vector<MyClass>::iterator it = AllMyClassRecords.begin();
            it != AllMyClassRecords.end(); ++it)
        cout << it->MyInt << " => " << *(it->MyInt) << endl;
}

int main() {
    MyBigClass MBC;

    MBC.loadMyClasses();
    MBC.readMyClasses();
}

基本上,我想创建一个指向另一个整数 vector 的指针 vector 。问题在于此代码打印出以下内容:

0x97ea008 => 159293472
0x97ea02c => 1
0x97ea040 => 2
0x97ea044 => 3
0x97ea078 => 4
0x97ea07c => 5
0x97ea080 => 6
0x97ea084 => 7
0x97ea0d8 => 8
0x97ea0dc => 9

除第一个值外,它似乎按预期工作,这可能是内存中的一些垃圾。为什么只有第一个值受到影响?如果我的代码坏了,为什么它只在插入的第一个指针处坏了?


更新:我在 Ubuntu 上使用 g++ 编译它。至于我在做什么,我正在创建一个编译器分析过程。 MyClass 对象包含有关指令的信息,我想在找到某些寄存器时更新这些信息。寄存器编号索引 vector 的 vector ,因此特定的寄存器编号将具有 MyClass*s 的 vector 。因此,如果找到寄存器, vector 中的任何 MyClass 指针都将用于更新保存在单独的 MyClass vector 中的 MyClass 对象。因为我正在累积存储在 MyClass 对象中的指令信息和必须遵循 MyClass 指针的注册信息,所以我无法创建整个 MyClass vector 优先而不创建单独的 channel ,我想避免这种情况。


更新 2:现在有图片...

Pass Progress           inserts...   InstRecs (TheInt)  and updates...  UpdatePtrs (MyClass) 
----------------------              ------------------                  -----------------------
| => I1: Uses r0, r1 |              | InstRec for I1 |                  | r0: InstRec for I1* |
|    I2: Uses r0, r2 |              ------------------                  | r1: InstRec for I1* |
----------------------                                                  -----------------------

首先,pass 插入一个包含 I1 信息的 InstRec。它还创建指向这个由寄存器编号索引的新 InstRec 的指针。这里的 r0 实际上是指向 I1 的 InstRec 的一个元素的 vector ,因此如果在后续指令中再次遇到 r0,I1 的 InstRec 将被更新。

Pass Progress           inserts...   InstRecs (TheInt)  and updates...  UpdatePtrs (MyClass) 
----------------------              ------------------                  -----------------------
|    I1: Uses r0, r1 |              | InstRec for I1 |                  | r0: InstRec for I1* |
| => I2: Uses r0, r2 |              | InstRec for I2 |                  |     InstRec for I2* |
----------------------              ------------------                  | r1: InstRec for I1* |
                                                                        | r2: InstRec for I2* |
                                                                        -----------------------

同样,第二个条目将被插入到 InstRecs 中,指针将被添加到 UpdatePtrs 结构中。由于 I2 使用 r0,另一个 InstRec 指针被推送到 r0 vector 。未显示的是:当检测到 I2 使用 r0 时,pass 在 r0 指针 vector 的 UpdatePtrs 结构中查找,跟随每个指针到它们的 InstRec 条目,并用新信息更新 InstRec。

希望这能让我想做的事情更清楚一些。我已经实现了 @MerickOWA 首先提出的建议,即使用 InstRec vector 索引而不是 InstRec 指针(因为一旦将 InstRec 添加到数组中,它们就永远不会移动),而且它现在似乎可以正常工作。

最佳答案

您正在做的与创建这样的东西非常相似:

vector<int> MyInts;
vector< vector<int>::iterator > MyIntIters;

然后每次您向 MyInts 添加一个新的 int 时,您都会获得迭代器并将该迭代器插入 MyIntIters

您不能使用 vector 执行此操作,因为只要您将新的 int 添加到 MyInts,迭代器就会变得无效。

所以你的整个结构都坏了。你需要想出一个全新的设计。首先我会问你为什么你想要一个指向另一个 vector 的迭代器(或指针) vector 。是用来排序的吗?以某种方式建立索引?还有别的吗?肯定有更好的方法来做任何您想做的事情。 您尝试做什么将有助于确定如何去做。

编辑:

在多次阅读和重读您的更新后,在我看来您正在尝试创建一个 gloms vector 。也就是说,一个长度可变的缓冲区,其开头有结构化数据,后面还有其他内容。

这是相当棘手的事情,需要动态分配。但是,您没有使用动态分配——您按值将对象插入 vector 。指向这些对象的指针将随着 vector 的大小调整和打乱而改变。

因此,如果这是您要尝试做的事情,您需要改变周围的情况,以便使用 new 创建您的 glom,并将指向 glom 的指针推到 vector 上。但这打开了整个潘多拉魔盒的麻烦。你做的缓冲区有多大?你如何解析glom?你如何处理深拷贝、调整大小等?你如何正确地释放 gloms 而不会像筛子一样泄漏?正如我所说,棘手的事情。在我的工作中,我们一直在做这种事情,并且有很多我们使用的标准做法。这些需要付出大量的努力和大量的试验和错误测试才能正确,但我们仍然发现问题。如果这就是您正在做的事情,您可能会考虑换一种方式。

关于对象和指针的 C++ vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4321040/

相关文章:

c - 仅在 eclipse 中出现此错误 "not a structure or union"

c++ - C argv指针类型

c++ - using::namespace::something 比 namespace::something 有什么好处?

php - c++ 和 php 中的 openssl 加密

c++ - 如何用模板函数替换宏?

c - 尝试在函数中重新分配数组时发生异常

vector - 如何在传递我正在迭代的向量时调用迭代器的函数?

r - 高效创建向量编码另一个向量的位置权重之和

c++ - 在模板化容器成员上调用类函数

c++ - C++中未初始化的内存