こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

C++ 動的確保について

学校の演習課題で「クラス Array のメンバ変数を以下のように変更して,配列のサイズを実行時に決められるようにしたい.コンストラクタを適切に修正しなさい.配列のサイズはコンストラクタの引数で指定できるようにすること.main 関数内のオブジェクトの宣言部分を適当に変更して動作を確認しなさい.」という課題が出ました。

指示のメンバ変数の変更は、sizeを定数にしていたものを変数にし、arrayを配列からポインタにする点です。

もとのプログラムはI、私がいじったものがIIです。どうにもセグメンテーションフォルトから抜け出せなくて困っています。どのようにしたら題意のプログラムになるのでしょうか?
よろしくお願いします。

ここからI~

#include <iostream>
using namespace std;

class Array{
private:
const static int size = 6;
int array[size];
public:
Array( );
int getSize( );
void put( int index, int data );
int get( int index );
void show( );
};

Array::Array( )
{
for ( int i = 0; i < size; i++ ) {
array[i] = 0;
}
}

int Array::getSize( ) {
return size;
}

void Array::put( int index, int data ) {
array[index] = data;
}

int Array::get( int index ) {
return array[index];
}

void Array::show( ) {
cout << "| ";
for ( int i = 0; i < getSize( ); i++ ) {
cout << get(i) << " | ";
}
cout << endl;
}

int main( ) {

Array array1;
array1.put(1, 2);
array1.put(4, 1);
array1.show( );

return 0;
}

~ここまでI

ここからII~

#include <iostream>
using namespace std;


class Array{
private:
int size;
int *array;
public:
Array(int s);
~Array();
int getSize();
void put(int index, int data);
int get(int index);
void show();
};

Array::Array(int s)
{
size = s;
array = new int;
for (int i = 0; i < size; i++) {
*array = 0;
array++;
}
array -= size;
}

Array::~Array()
{
delete[] array;
cout << "デストラクタが呼ばれました。配列の要素数分のメモリを開放します." << endl;
}

int Array::getSize() {
return size;
}

void Array::put(int index, int data) {
*(array + index) = data;
}

int Array::get(int index) {
return *(array + index);
}

void Array::show() {
cout << endl << "| ";
for (int i = 0; i < getSize(); i++) {
cout << get(i) << " | ";
}
cout << endl;
}

int main() {

int s = 0;

cout << "確保するサイズを入力してください:";
cin >> s;

Array array1(s);
array1.put(1, 2);
array1.put(4, 1);
array1.show();

return 0;
}

~ここまでII

投稿日時 - 2015-10-26 23:28:34

QNo.9070411

すぐに回答ほしいです

質問者が選んだベストアンサー

それは現象が全く変わらなかったという事でしょうか?

落ちている箇所は
Array::~Array()
{
delete[] array; ←★
cout << "デストラクタが呼ばれました。配列の要素数分のメモリを開放します." << endl;
}

★の箇所です。

できたファイルを実行して 1000と入力してもうまく行きますけどね。
治す前は8以上は落ちてましたね。

不思議ですね。

投稿日時 - 2015-10-27 20:47:17

補足

何度試しても、デバッグエラーまたはプログラムの動作が止まる、または予兆なく落ちる、のいずれかの挙動をしめし、正常に実行できませんでした。
なぜ私の環境ではできないのでしょうか?

投稿日時 - 2015-10-28 20:49:12

お礼

プロジェクトを作り直したら実行できるようになりました

投稿日時 - 2015-10-30 20:37:51

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

Array::Array(int s)内の

array = new int;

array = new int[s];

投稿日時 - 2015-10-27 00:44:59

補足

申し訳ございません、試してみたのですが、まだエラーが出てしまいます。

投稿日時 - 2015-10-27 19:50:56

あなたにオススメの質問