删除未使用的变量后的c++挂起
C++ hangUp after removing unused variables
这个简单的代码是在Dev c++中介绍的。在这段代码中,没有使用变量f
和a
。在我删除或注释它们之后,程序就会挂起。为什么?
#include <iostream>
#include <vector>
using namespace std;
#define N 10*1000*1000
bool p[N];
int f[N], a[N];
vector<int> primes;
int main()
{
for(int i=2 ; i<=N ; i++)
if(!p[i])
{
for(int j=i ; j<=N ; j+=i)
p[j]=true;// or =1
primes.push_back(i);
}
system("PAUSE");
return EXIT_SUCCESS;
}
您正在读取/写入p数组的边界。
在内存中,在p[N]数组之后是f[N]数组,然后是a[N]数组。
所以当你想写p[n]时,你实际上会写f[0]。
当你删除f和数组时,你将写入vector
vector是一个类,所以你搞砸了一些重要的东西。我的猜测是,当j == N时,在push_back调用时,代码将冻结。
因为你索引到,并且包括 N,你需要有这个:
#define N (10*1000*1000)
bool p[N+1];
<<p>因为p[N]
只有索引em> 0…(n - 1) 。还要注意添加到#define中的()
。总是使用这些,否则你可能会以有趣的结果告终,因为N
是而不是 10000000
, N
在你的代码中是10*1000*1000
。
对于未使用的变量,当您在无效索引下访问p
时,您可能正在访问未使用变量的内存,并且没有发生任何事情(这次,这是未定义行为,因此"任何事情"都可能发生)。但是,当您删除未使用的变量时,您实际上覆盖了vector
对象的数据,损坏了它,然后"未定义行为"导致崩溃(也可能有更糟糕的结果)。
相关文章:
- 挂起和取消挂起一个文件DLL
- 如何防止C++遗留代码中的挂起指针
- 为什么所有C++编译器都会崩溃或挂起此代码
- 我编写了代码将十进制分数转换为其二进制等效数.它编译得很好,但在执行时挂起
- 构建挂起,即使是适度的文件大小
- 循环挂起迭代的 std::擦除 on std::list
- Poco::Net::FTPClientSession 在 open() 方法上挂起 129 秒,如果 ftp 主机不存
- Node.js fs.open() 在尝试打开 4 个以上的命名管道 (FIFO) 后挂起
- 从不同进程中的另一个线程挂起/恢复线程或进程
- Boost (Beast) websocket:同步写入挂起
- 为什么析构函数挂起
- 使用互斥会挂起程序
- 在C++和 Python 程序中使用命名管道的 IPC 挂起
- 设置变量时C++程序挂起
- 第一次尝试使用new动态创建结构数组,程序挂起没有错误
- 从stdin读取时子进程挂起(fork/dup2竞争条件)
- 有时ShowWindow从不调用OnShowWindow,主应用程序挂起
- 如何防止GUI挂起,同时允许第二次操作与Qt中的第一次操作一起执行
- WTSFreeMemory在启动期间从服务调用时挂起-我应该省略吗
- C++HTTP客户端在GET请求后挂起read()调用