c ++偶尔的动态指针崩溃
c++ Occasional Dynamic Pointer Crashing
我编写了一个程序来接收用户的浮点输入以创建一个动态数组(然后使用这些输入和函数来查找基本的东西,比如最大、最小、总和、平均,但这些东西工作正常所以我不' think Ill include here for purpose of not creating a code wall)。
大约一半的时间它都有效,虽然我对原因有一些理论,但我无法找到解决方案。
int main() {
int Counter = 0;
float *UsrIn = nullptr;
float Array[Counter];
我的第一个想法是下面的部分是问题所在。我的 class 还没有真正了解我能记得的与 new 一起使用的符号(我假设它指的是字节,所以科学记数法可能会起作用)。我只是为了测试而尝试了 20 个,它似乎有效(事后看来可能是一个愚蠢的假设)。
UsrIn = new float[(int)20];
cout << "Enter float numbers:" << endl;
cout << "Enter '9999999' to quit:" << endl;
cin >> *UsrIn; // User Input for pointer Dynamic Array
Array[Counter] = *UsrIn;
while(*UsrIn!=9999999) // User Input for Dynamic Array
{
Counter++;
UsrIn++;
cin >> *UsrIn;
Array[Counter] = *UsrIn;
}
delete UsrIn;
delete[] UsrIn;
我的另一个想法是,指针地址可能已被其他东西使用,或者它可能以某种方式无效。我不知道有什么方法可以对此进行测试,因为我偶尔遇到的崩溃只会在输入“9999999”
后退出 while 循环时发生
附带说明一下,我没有收到任何警告或错误消息,只是来自 eclipse 的崩溃程序。
Variable-length 数组在 C++ 实现中并未得到普遍支持,尽管您的编译器明确支持它们。根据您的描述,问题在于此代码:
int main() {
int Counter = 0;
float *UsrIn = nullptr;
float Array[Counter];
您正在定义大小为 0 的 variable-length 数组。因此,虽然您为 UsrIn
分配了 20 个条目,但您没有为 Array
分配任何内存。 variable-length 数组的目的是分配给定大小的数组,其中直到 运行 时间才真正知道大小。根据您的其他代码,这里的情况并非如此。最简单的方法就是更改 Array
尺寸以匹配您的 UsrIn
尺寸,例如:
float Array[20];
如果你真的想要更多的动态行为,你可以使用 std::vector<float>
std::vector<float> Array;
...
Array.push_back(*UsrIn);
我编写了一个程序来接收用户的浮点输入以创建一个动态数组(然后使用这些输入和函数来查找基本的东西,比如最大、最小、总和、平均,但这些东西工作正常所以我不' think Ill include here for purpose of not creating a code wall)。
大约一半的时间它都有效,虽然我对原因有一些理论,但我无法找到解决方案。
int main() {
int Counter = 0;
float *UsrIn = nullptr;
float Array[Counter];
我的第一个想法是下面的部分是问题所在。我的 class 还没有真正了解我能记得的与 new 一起使用的符号(我假设它指的是字节,所以科学记数法可能会起作用)。我只是为了测试而尝试了 20 个,它似乎有效(事后看来可能是一个愚蠢的假设)。
UsrIn = new float[(int)20];
cout << "Enter float numbers:" << endl;
cout << "Enter '9999999' to quit:" << endl;
cin >> *UsrIn; // User Input for pointer Dynamic Array
Array[Counter] = *UsrIn;
while(*UsrIn!=9999999) // User Input for Dynamic Array
{
Counter++;
UsrIn++;
cin >> *UsrIn;
Array[Counter] = *UsrIn;
}
delete UsrIn;
delete[] UsrIn;
我的另一个想法是,指针地址可能已被其他东西使用,或者它可能以某种方式无效。我不知道有什么方法可以对此进行测试,因为我偶尔遇到的崩溃只会在输入“9999999”
后退出 while 循环时发生附带说明一下,我没有收到任何警告或错误消息,只是来自 eclipse 的崩溃程序。
Variable-length 数组在 C++ 实现中并未得到普遍支持,尽管您的编译器明确支持它们。根据您的描述,问题在于此代码:
int main() {
int Counter = 0;
float *UsrIn = nullptr;
float Array[Counter];
您正在定义大小为 0 的 variable-length 数组。因此,虽然您为 UsrIn
分配了 20 个条目,但您没有为 Array
分配任何内存。 variable-length 数组的目的是分配给定大小的数组,其中直到 运行 时间才真正知道大小。根据您的其他代码,这里的情况并非如此。最简单的方法就是更改 Array
尺寸以匹配您的 UsrIn
尺寸,例如:
float Array[20];
如果你真的想要更多的动态行为,你可以使用 std::vector<float>
std::vector<float> Array;
...
Array.push_back(*UsrIn);