2012-09-26 116 views
1

我已將此作爲用於作業的.H文件給出,並且我的任務是創建.C以便與之一起使用。這真的很簡單,我確信我錯過了一些小東西。傳遞值時出現分段錯誤

#ifndef String_H 
#define String_H 

#include <iostream> 

class String 
{ 
public: 

    // constructor: initializes String with copy of 0-terminated C-string 
    String(const char *p); 

    // destructor (when can shared data be released?) 
    ~String(); 

    // copy constructor (how does this change reference counts?) 
    String(const String &x); 

    // assignment operator (how does this change reference counts?) 
    String &operator=(const String &x); 

    // return number of non-0 characters in string 
    int size() const; 

    // return reference count 
    int ref_count() const; 

    // returns pointer to character array 
    const char *cstr() const; 

private: 

    // data containing character strings 
    // shared by Strings when copying/assigning 
    struct SharedCString 
    { 
    char *data; // 0-terminated char array 
    int n;  // number of non-0 characters in string 
    int count; // reference count, how many Strings share this object? 
    }; 

    SharedCString *shared; 
}; 

#endif 

在我的構造函數中,當我嘗試將SharedCString的count值設置爲1時,出現分段錯誤。

我試圖用它傳遞:

​​

我不知道爲什麼,這是行不通的。

+1

您還沒有提供您爲構造函數編寫的代碼,所以很難說。但是,你有沒有爲'shared'分配內存? –

+0

我認爲它是在String.H中提到的,它是在「SharedCString * shared」構建的,我錯過了什麼? – Classtronaut

+1

是的;該聲明僅僅意味着指針指向*某處*,但不會自動爲其分配任何空間。根據頭文件中的註釋,本練習的重點是讓您瞭解指針的含義以及如何使數據表示更有效。 –

回答

2

如果你上線

shared->count = 1; 

得到一個segfault然後shared爲空或者是垃圾,指着你的進程沒有自己的記憶。

你應該訪問它之前做

shared = new SharedCString; 

+0

好點,會編輯。 –

+0

非常感謝!我早些時候以這種方式設置了自己的東西,但是其他課程中的一個錯誤讓我第二次猜測自己,現在我已經開始工作了,謝謝! – Classtronaut

2

您必須爲SharedCString分配內存空間。這是一個指針,指向一些隨機內存地址(就像任何未初始化的變量)。

這個問題涉及它:Dynamically allocate memory for struct