是否有可能获得私人会员并使用其信息/功能?

时间:2013-11-29 06:44:08

标签: c++ segmentation-fault shared-ptr getter

我在运行时的代码中遇到了一个非常令人费解的SEGFAULT。以下是情况的细分:

///The following is only an example of the situation
class SimpleChar{
    private:
    int level;
    float health;
    std::shared_ptr<Item> inventory[20];
    public:
    std::shared_ptr<Item> getInventory(int i){return inventory[i];};
};

class Item{
    private:
    int itemID,Str,Dex,Int;
    Coord3 pos;
    public:
    int getItemID(){return itemID;};
    int getStr(){return Str;};
    Coord3 getPos(){return pos;};
};

struct Coord3{
    float x,y,z;
    void setPos(float tx,float ty,float tz){
        x=tx;y=ty;z=tz;}
};

int main(){
    //myChar is a member variable of another class, placed in main to simulate the pointer
    SimpleChar *myChar= some_other_instance.getTarget();
    ///other initialize code for myChar

    ///In this if statement, which lines would not work?
    if(myChar->getInventory(0).get()!=NULL){
        myChar->getInventory(0)->getPos().setPos(0,0,0);
        std::cout<<myChar->getInventory(0)->getStr()<<std::endl;
            myChar->getInventory(0)->doSomethingElse();
    }
}

上面的代码说明了SEGFAULT落在了什么线上。 SEGFAULT是真实的:

//SEGFAULT, actual copied segfault from the line: if(myChar->getInventory(0).get()!=NULL)
#0 00993891 std::tr1::__shared_ptr<Carp::Item, (__gnu_cxx::_Lock_policy)1>::get(this=0x4d0) (z:/cpp programming/codeblocks/mingw/bin/../lib/gcc/mingw32/4.7.0/include/c++/tr1/shared_ptr.h:685)
#1 00413D09 Carp::WinBag::update(this=0x2857f8, o=false) (Z:\CPP Programming\Carperon\Source\Carp\Interface.cpp:53)
#2 00416B5C Carp::GameUI::checkUpdate(this=0x2857e4) (Z:\CPP Programming\Carperon\Source\Carp\Interface.cpp:231)
#3 00401B7B Carp::GameApp::loopGame(this=0x27cca8) (Z:\CPP Programming\Carperon\main.cpp:35)
#4 00401EBB _fu2039___ZSt4cout() (Z:\CPP Programming\Carperon\Source\Application.cpp:17)
#5 004017A9 main() (Z:\CPP Programming\Carperon\main.cpp:6)

当看到这个时,我无法理解可能导致此问题的原因。我是否正在使用getter函数来使用其他私有成员的信息?或者我是如何“获得”对象的还有其他问题?

如何在不导致SEGFAULT的情况下正确获取myChar信息,并相应地使用它的信息/功能,我该怎么做?

2 个答案:

答案 0 :(得分:0)

错误似乎与第一行有关。

您确定myChar不是NULL开头吗?什么是getTarget?它可以返回一个空指针吗?

答案 1 :(得分:0)

如果您尝试使用私有成员信息,编译器会说明您并且程序无法编译。

此处对main功能的描述不清楚。但看起来您在正确初始化之前使用some_other_instance,因此很可能myChar为空。只需在程序中添加一项检查,或使用cout进行检查。