2016-03-30 4 views
-1

整数を入力として受け取り、それらを印刷する配列に配置するためのコードを記述していました。C++スタックトレースを* .exe.stackdumpにダンプする

私は私の知る限り、私のポインタのすべてを掃除していますが、私は、実行時エラーを取得しておいてください。コードの

1 [main] new 3444 cygwin_exception::open_stackdumpfile: Dumping stack trace to new.exe.stackdump

体:

#include <iostream> 
#include <sstream> 
#include <string> 
using namespace std; 

int array[10]; 
int * p = array; 

int *readNumbers() 
{ 
    int i=0; 
    for(i=0;i<10;i++) 
    { 
     string number; 
     int numb; 
     cout << "enter digit " << i << " of 10" << endl; 
     getline(cin, number); 
     istringstream (number) >> numb; 
     array[i]=numb; 
    } 
    return p; 
    delete p; 
} 

void printNumbers(int *numbers,int length) 
{ 
    int i; 
    for(i=0;i<length;i++) 
    { 
     cout << i << " " << *(numbers+i) << endl; 
    } 
} 

とメイン呼び出しコード:

#include <iostream> 
#include <sstream> 
#include <string> 
using namespace std; 

extern int *readNumbers(); 
extern void printNumbers(int *,int); 


int main() 
{ 
    int * q = readNumbers(); 
    printNumbers(q,10); 
    delete q; 
    return 0; 
} 

したがって、スタックへの解決策を探しているダンプ... また、cinによって返されたstring numberを適用した方法は、array[10]に含まれる値には問題がありませんでしたので、その上の注意事項はすばらしいと思います。 ありがとう

+0

ベストソリューションは開発環境によって異なりますので、OS、コンパイラ、IDEなどについて詳しく説明する必要があります。 – nodakai

+1

サイドノート: 'return p;'の後の 'delete p;'は決して実行されません。とにかく新しく割り当てられていないものを削除するのはなぜですか?これは実際にあなたのクラッシュの根本原因と思われるあなたのメイン関数の 'delete q;'に当てはまります –

+1

qが配列を指しているので、メインの呼び出しコードでqを削除すべきではありません – stan

答えて

1

deleteが無効です。あなたが割り当てたものは、newでしか削除できません。

最初のものは返品後に実行されるので、無害です(これは、コンパイラの警告を見てください)。

あなたのクラッシュが発生する可能性があります。

Also I'm sure the method I used to apply the string number returned by cin to the values contained in array[10] is not what the question was looking for so any notes on that would be great. 

これで問題ありません。疑問があるのは、配列のサイズをどこにでも広げていることです。変更したい場合はどうなりますか?

2

関数内に割り当てられたメモリへのポインタを返すことはお勧めできません。この場合、関数内に割り当てていなくても、グローバル空間でそれを行っています。 コンパイル中にすべての警告を有効にし、割り当てを行っているときにエラーとして扱うことも良い習慣です。 ヒントとして、メイン関数でメモリを割り当ててから、ポインタをreadNumbers関数に渡すことができます。この方法では、同じスコープ内にとどまり、管理が容易になります。また、配列の長さをprintnumbers関数に渡すのと同じ方法で、配列をハードコードする代わりにreadnumbers関数に渡す必要があります。

関連する問題