2014-09-11 136 views
0

我在分配任務代碼時遇到了問題。該計劃基於大學生在線比賽問題檔案。訪問衝突寫入位置0x00000000。指針問題

這裏是頭文件:

#include <iostream> 
#include <cmath> 
using namespace std; 

class Vito 
{ 
public: 
    Vito(int relative_count); //constructor 
    ~Vito(); //destructor 
    int min(); //finds minimum "distance" between vito's relatives 

private: 
    int *streets; //pointer to array of street numbers 
    int sum(int index); //generates sum of distances for each of vito's relatives 
    void getStreetNums(); //retrieves street numbers from user 
    int relatives; //used globaly to set number of repititions 
}; 

Vito::Vito(int relative_count = 0) 
{ 
    int *streets = new int[relative_count]; //allocates memory for array streets 
    relatives = relative_count; 
    getStreetNums(); 
} 

Vito::~Vito() 
{ delete [] streets; } //releases memory used by class 

void Vito::getStreetNums() 
{ 
    cout << "Enter all street numbers, seperated by a space: "; 
    int street_num; 
    for (int i = 0; i < relatives; i++) 
    { 
     cin >> street_num; 
     streets[i] = street_num; 
    } 
} 

int Vito::min() 
{ 
    int MIN = 65546, test_distance; //initialized to maximum possible value for an integer in C++ 

    for (int i = 0; i < relatives; i++) 
    { 
     test_distance = sum(i); 

     if(MIN > test_distance) 
     { MIN = test_distance; } 
    } 
    return MIN; 
} 

int Vito::sum(int index) 
{ 
    int SUM = 0, street_num; 
    street_num = *(streets+index); //set value for determining distances between one house and the others 

    for (int i = 0; i < relatives; i++) 
    { SUM += abs(street_num - streets[i]); } 

    return SUM; 
} 

這裏是主要的:

#include <iostream> 
#include "proj_02.h" 
using namespace std; 

int main() 
{ 
    int relatives, tests; 
    cout << "This program will supply a minimum distance between homes based on a given number of relatives and street numbers their homes are on. All entered values must be integers." << endl << endl; 
    cout << "Enter how many tests will be run: "; 
    cin >> tests; 
    for (int i = 0; i < tests; i++) 
    { 
     cout << "Enter how many relatives will be used in test " << i+1 << ": "; 
     cin >> relatives; 
     Vito family(relatives); 

     cout << "For this case, the minimum distance between each relatives house compared to each other is: " << family.min() << endl << endl; 

    } 
} 

執行後,我得到一個錯誤消息說「0000005:訪問衝突寫入位置00000000。」在這裏:

void Vito::getStreetNums() 
{ 
    cout << "Enter all street numbers, seperated by a space: "; 
    int street_num; 
    for (int i = 0; i < relatives; i++) 
    { 
     cin >> street_num; 
     streets[i] = street_num; 
    } 
} 

調試表明,對街道設置一個空的內存地址,但我爲它早些時候在構造函數中分配的內存。任何人都可以解釋這裏發生了什麼?

+1

無法在合理的系統中寫入NULL ...如果存在可能爲空的可能性,您總是必須檢查NULL的指針值。 – 2014-09-11 02:36:08

回答

5
Vito::Vito(int relative_count = 0) 
{ 
    int *streets = new int[relative_count]; //allocates memory for array streets 

在構造函數中,定義了一個局部變量streets,併爲它分配內存。局部變量streets會影響類成員streets。將其更改爲:

Vito::Vito(int relative_count = 0) 
{ 
    streets = new int[relative_count]; //allocates memory for array streets 
+0

更好的是,使用'std :: vector streets;'作爲類成員,並且廢除指針和'new'並且'刪除' – 2014-09-11 02:46:52

+0

我應該暫時使用指針,但是感謝幫助,我欣賞它 – thil13 2014-09-11 03:08:19

相關問題