2013-07-10 52 views
-2

我有一個巨大的圖書館,我試圖理解,我遇到了一個問題,同時做一些單元測試(升壓):內存訪問衝突沒有在虛假地址的映射。爲什麼我不能更改這個非常量變量的值?

爲了解釋它們的結構和我嘗試做的相關部分,想象一下:

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

在我的主文件,我初始化一個對象,並打印AA-> X(和我得到0 )。如果我寫A.a-> x = 0,沒問題。如果我試圖以任何方式修改該值,我會得到上述錯誤...發生了什麼?另外,我不想修改他們的代碼,但我真的需要增加這個x。

+0

結構A {INT X; } <〜needs;在末尾 –

+1

成員變量'a'似乎沒有被初始化爲任何東西 - 它需要指向一些有效用於存儲int的內存...... –

+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 

一個具有無關PBAR

pBar->a = 5; 

轉化爲

*(pBar).a = 5; 
+0

問題是我想使用他們的庫,而不是修改它,並且我很難相信他們的代碼有問題。我只需要知道什麼可能會導致錯誤。 – Ioana

+1

這不是關於定義,而是關於如何正確使用它。 ** Bjarne **可以創建一個包含公共指針的庫。這並不意味着指針會被神奇地初始化。這是你的工作。 –

相關問題