2016-05-20 4 views
0

私はpersonというクラスを持っていますが、コンストラクタの "new"キーワードで動的に割り当てられるintの配列を指しています。しかし、私は、メンバ関数、 "人:: getval"からポインタを介してこの配列にアクセスしようとすると、私は間違って何をしている上で読み取りアクセス違反を受け取りましたか?スコープとは何か関係があるかもしれないと思います。なぜなら、コンストラクタ内部から "numlist"配列にアクセスすると問題はないからです。ありがとう。メンバー関数を使用して動的に割り当てられたメンバー変数にアクセスしようとするとアクセス違反が発生する

person.h

class person { 
public: 
    person(); 
    person(int length); 
    ~person(); 
    int getval(int a); 
    void setval(int a, int b); 
private: 
    int* numlist; 
    int listlength; 
    int age; 

}; 

#include "stdafx.h" 
#include "person.h" 

person::person() { 
    person(4); 
} 
person::person(int length){ 
    age = 16; 
    numlist = new int[length]; 
    listlength = length; 
    for (int k = 0; k < length; k++) { 
     numlist[k] = 0; 
    } 
} 
person::~person() { 
    delete[] numlist; 
} 
int person::getval(int a) { 
    return *(numlist + a);   //READ ACCESS VIOLATION OCCURS HERE 
} 

void person::setval(int position, int val) { 
    *(numlist + position) = val; 
} 

メインperson.cpp

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


int main() 
{ 
    person mark; 
    cout << mark.getval(1)<<endl; 
    int x;  //hold output 
    cin >> x; 
    return 0; 
} 
あなたが呼び出していない、一時的な人物を作成し、それを何もしていません
+0

これは 'person(4);'あなたがしていると思わないことです – Drop

答えて

2
person::person() { 
    person(4); 
} 

あなた自身のコンストラクタです。

person::person() : person(4) {} 
+0

投稿した修正版ではどういうことが起こっていますか?私は前にその構文を見ていない。 – ehal

+0

"初期化リスト" –

0

デフォルトのコンストラクタは、自分が行っていると思われることを実行していません。

person::person() { 
    person(4); 
} 

私はあなたが上記のデフォルトコンストラクタはサイズ4の配列とpersonインスタンスを初期化していると思います推測しています。しかし、person(4)は、コンストラクター本体に一時オブジェクトインスタンスを作成しています。このインスタンスは、スコープ外になり、コンストラクター本体の最後で破棄されます。これにより、デフォルトで構築されたpersonオブジェクトは、動的に割り当てられていない配列になります。

0
person mark; 

は、person()コンストラクタを呼び出します。私はこのコンストラクタ以下に列挙している:

person::person() { 
    person(4); 
} 

それはperson(int length);コンストラクタで作成したタイプpersonの一時的な匿名の変数を作成します。この匿名の人物はコンストラクタから返されると破棄され、markは効果的に初期化されません。

markを作成中に作成され破棄されたpersonは、numlistに割り当てられた記憶域を持っていました。 mark

int person::getval(int a) { 
    return *(numlist + a); 
} 

の下、ジャック、そうmark.getval(1)を得た初期化されていないnumlistaを追加し、その結果、未知のアドレスのメモリにアクセスしようとしました。定義されていない動作ハイジンクスが続く。

関連する問題