【问题标题】:Why can't I change the value of this nonconstant variable?为什么我不能改变这个非常量变量的值?
【发布时间】:2013-07-10 21:45:13
【问题描述】:

我有一个庞大的库,我试图理解它,但在进行一些单元测试(提升)时遇到了一个问题:内存访问冲突没有映射到错误的地址。

为了解释它们结构的相关部分以及我试图做什么,想象一下:

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

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

【问题讨论】:

  • 结构 A { int x; }
  • 成员变量 a 似乎没有被初始化为任何东西 - 它需要指向一些有效的内存来存储 int...
  • 显示真实代码。将其简化为您能想出的最小示例,该示例可以编译并运行并演示问题。
  • “some_function”利用了超过 3 个源文件中的其他函数,并且所有函数的长度都为数十行......我想使用他们的库,而不是理解它或修改它。我只是想知道可能导致问题的原因是什么?
  • 你说:“如果我写 Aa->x=0,没问题。如果我尝试以任何方式修改该值,我会收到上述错误......” - 那是什么意思是什么意思??? A.a->x=0 试图修改 x。你说它给你“没问题”。然而在下一句中,您说任何修改x 的尝试都会给您一个错误。这是自相矛盾的。那么,它是什么:“没问题”或“给出错误”???

标签: c++ boost


【解决方案1】:

根据您的说法,看起来指针在使用之前没有被初始化。

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;

【讨论】:

  • 问题是我想使用他们的库,而不是修改它,我很难相信他们的代码有问题。我只需要知道可能导致错误的原因。
  • 这不是关于定义,而是关于如何正确使用它。 Bjarne 可以创建一个包含公共指针的库。这并不意味着指针会被神奇地初始化。这是你的工作。
猜你喜欢
  • 2015-02-03
  • 2021-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多