无法访问存储在多维向量中的对象(C++)

Posted

技术标签:

【中文标题】无法访问存储在多维向量中的对象(C++)【英文标题】:Can't access to Object stored in multidimensional vector (C++) 【发布时间】:2015-03-06 17:19:53 【问题描述】:

我尝试访问存储在多维向量中的对象:

它是Case类的一个对象。

Carte::Carte(int x, int y) 
this->x = x;
this->y = y;
    for(int i; i<x; i++)
        carte.push_back(std::vector<Case*>());
        for(int j = 0; j<y; j++)
            Case aCase(i, j);
            carte[i].push_back(&aCase);
        
    

我的 Carte.h:

class Carte 
public:
Carte(int x, int y);
virtual ~Carte();
std::vector< std::vector<Case*> > carte;
int x,y;
;

一切都很好,但是当我想将 Carte 的对象传递给另一个类的构造函数并尝试读取 Case 类的变量时(因为我的向量中有 Case 类的对象):

//I deleted the extra code...
Batiment::Batiment(Carte *carte) 
carte->carte[this->x][this->y]->libre = false;

这是我的课堂案例:

class Case 
public:
Case(int x, int y);
virtual ~Case();
int x,y;
bool libre;
;

当我执行时,有一个“退出值 = -1”。

所以我调试,它说:

Failed to execute MI command:
-data-evaluate-expression "(((('std::_Vector_base<Case*,std::allocator<Case*> >' *) this))->_M_impl)"
Error message from debugger back end:
Cannot access memory at address 0x78

编译过程中没有错误,但似乎我无法访问对象在向量中的位置...

有人知道为什么吗?

谢谢。

【问题讨论】:

为什么要存储指针? 你的意思是? 'std::vector<:vector> >' ?因为我不希望那个向量复制对象 @user3262670:所以使用emplace_backpush_back 临时(这样可以省略副本)。或者不要担心复制这样一个小对象的成本。指针几乎从来都不是避免复制的正确方法。 @user3262670:需要考虑成本效益比,而您的做法是错误的。 :) 好的,我将push_back不带指针,因为我没有应该编译的c++11,但错误仍然存​​在(无法访问内存),为什么?谢谢 【参考方案1】:

您将一个指针推送到一个局部变量,该变量将超出范围并在您使用该指针之前被破坏,导致您取消引用一个杂散指针,您将获得undefined behavior

有问题的代码:

for(int j = 0; j<y; j++)
    Case aCase(i, j);
    carte[i].push_back(&aCase);

对象aCase 将超出范围并在循环的下一次迭代中被破坏。

【讨论】:

哦,谢谢!那么我该如何创建非本地对象的新对象呢? @user3262670 很简单,要么使用 new 动态创建,要么最好完全停止使用指针并存储实际对象。

以上是关于无法访问存储在多维向量中的对象(C++)的主要内容,如果未能解决你的问题,请参考以下文章

访问指向多维向量的指针向量中的元素

如何将对象存储在向量中的对象中? (C++)

C ++跨类访问基对象向量中的派生对象的引用

如何在 C++ 中访问类对象向量中的对象?

如何从 C++ 中的“指向对象的指针”向量访问对象

将文件中的双值数字读入 C++ 中的向量并访问它们的值