C ++将堆栈跟踪转储到* .exe.stackdump

时间:2016-03-30 10:06:56

标签: c++ arrays string pointers stack-trace

为分配编写了一些代码,将整数作为输入,并将它们放在要打印的数组中。

据我所知,我正在清理所有指针,但我不断收到运行时错误:

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;
}

所以只是寻找堆栈转储的解决方案...... 另外,我确定我用string number返回cin返回array[10]所包含的值的方法不是问题的所在,所以任何关于此的注释都会很棒。 感谢

2 个答案:

答案 0 :(得分:2)

返回指向函数内部分配的内存的指针并不是一个好习惯,在这种情况下,你甚至没有在函数内部分配它,你已经在全局空间中完成了。 最好在编译期间激活所有警告,甚至在执行任务时将其视为错误。 作为提示,您可以在main函数中分配内存,然后将指针传递给readNumbers函数。这样它就会保留在同一范围内,并且更易于管理。 另外,就像你将数组的长度传递给printnumbers函数一样,你应该将它传递给readnumbers而不是硬编码。

答案 1 :(得分: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.

没关系。什么是可疑的是在各地扩大阵列的大小,如果你想改变它会发生什么?