为什么我不能改变这个非常数变量的值?

时间:2013-07-10 21:45:14

标签: c++ boost

我有一个巨大的库,我正在努力理解,并且在进行一些单元测试时遇到了问题(提升):内存访问违规没有错误地址的映射。

要解释其结构的相关部分以及我尝试做的事情,请想象一下:

struct A {int x;}
class B { public: A *a; A(something_else) { some_function;} }

在我的主文件中,我初始化一个A对象并打印A.-> x(我得到0)。如果我写A.-> x = 0,没问题。如果我尝试以任何方式修改该值,我会得到上述错误......发生了什么?另外,我不想修改他们的代码,但我真的需要增加x。

1 个答案:

答案 0 :(得分:2)

根据你的陈述,看起来指针在使用之前没有被初始化。

A* a; // This pointer points to nothing ... meaning a == NULL / 0

int b = a->x; // ERROR! Segmentation fault!

a = new A;

int c = a->x; // Undefined

a->x = 5;

int d = a->x; // 5


/* ... */

delete a;


/* Library */

struct Bar
{
    int a;
};

class Foo
{
public:
    Bar* pBar;
    Foo(){ }
    ~Foo()
    {
        delete pBar; // If it's null, nothing will happen
    }
};


/* main.cpp */

Foo foo();
foo.pBar = new Bar;

foo.pBar->a = 5; // 5

a与pBar

无关
pBar->a = 5; 

转换为

*(pBar).a = 5;