C++ std :: vector

问题描述:

我遇到了shared_ptrS向量的问题。我的代码是:C++ std :: vector <std :: shared_ptr>

//--------scoala.h-------- 

class Scoala 
{ 
public: 
    Scoala(std::string); 

    int adaugaElev(std::shared_ptr<Elev> elev); 
private: 

    std::vector<std::shared_ptr <Elev>> __elevi; 
}; 



//-----------scoala.cpp----------------------------- 

int Scoala::adaugaElev(std::shared_ptr<Elev> elev) 
{ 
    __elevi.push_back(elev); 
    return __elevi.size() - 1; 
} 

我运行它,我得到这个“在elev.exe未处理的异常在0x0137b559:0000005:访问冲突读取位置0xcccccd0c”。怎么了 ?

+7

除了其他任何名称'__elevi'在C++用户代码中是非法的,所有包含双下划线或以下划线和大写字母开头的名称都是非法的。您还需要发布调用您的函数的代码,并调查引用的概念。 – 2011-05-21 11:58:19

+0

请使用文本编辑器中的“{}”按钮来格式化您的代码。当你的问题*可读*时,你会得到更好的答案。 – jalf 2011-05-21 11:59:21

+0

是的,没有什么奇怪的。看看你的shared_ptr初始化。 – 2011-05-21 12:00:33

传递给adaugaElev的高电平对象很可能未被分配,或者以某种方式未分配(引用计数在shared_ptr中为零) - 您需要发布更多代码,以显示如何分配Elev对象以确认这一点。

valgrind下运行您的程序 - 这将有助于说明问题出在哪里。

+2

思考是一个更好的解决方案。 – 2011-05-21 14:18:01

在C++中使用双下划线前缀名是未定义的行为。另外,Elev可能因各种原因被捣毁,我会追查它的起源。

+0

那么,不完全没有定义的行为... – 2011-05-21 14:49:37

+0

其实,我很确定它实际上是未定义的行为。 – Puppy 2012-08-26 10:46:24