使用动态数组操作内存中的垃圾

Posted

技术标签:

【中文标题】使用动态数组操作内存中的垃圾【英文标题】:Trash in operating memory with dynamic arrays 【发布时间】:2019-07-11 19:40:09 【问题描述】:

我尝试了一种算法,它计算有多少数字被除而没有余数。代码有效,但每次我运行它时,我的输出中都会出现“垃圾”数字。我正在使用动态数组来解决问题。

#include <iostream>
using namespace std;

 int main() 
 
    int N = 30;

    int *data = new int [N];

    for (int i = 0; i < 100; i++)
    
        for (int c = 1; c < N; c++)
        
            if (i % c == 0)
            
                data[c] += 1;
             
         
     

     for (int k = 1; k < N; k++)
     
        cout << data[k] << endl;
     

     delete [] data;
 

至少我希望拥有 C++ Shell 所说的:http://cpp.sh/6xtc

100
50
34
25
20
17
15
13
12
10
10
9
8
8
7
7
6
6
6
5
5
5
5
5
4
4
4
4
4

,但在不同的IDE中得到相同的结果:

100
11932994
34
25
20
17
15
13
12
620757039
37045
11951945
8
11927896
7
7
7290
158
6
5
5
570425383
37040
11951941
4
11927892
4
1835102827
859059803

【问题讨论】:

代码有效,但每次运行时,我的输出中都会出现“垃圾”数字。这句话由两个不可调和的部分组成。 【参考方案1】:

你会的

int *data = new int [N];

并分配一个 N 大小的数组。然后您立即开始尝试增加其中的值:

data[c] += 1;

但是里面的内容是什么?

如果您想保证所有的值都将被初始化为 0,根据this answer,您可以使用以下方式分配您的数组:

int *data = new int [N]();
//                    ^^^^

std::vector!”在这里评论。\>

(但实际上,向量会使这种方式更容易并完全避免这个问题)

【讨论】:

我正在考虑使用我初始化为 0 的“垃圾信息”。它是否可以在计算机上其他重要运行程序的其他地方使用,而我刚刚中断了一个进程?跨度> @Pr.Germux 我不完全确定我是否理解您的问题,但是当您这样做时 new int [N](); 您是在说“请给我足够的连续内存块来存储 N 个整数”并且计算机找到了一块没有其他人使用的大内存,并在上面贴了一张写有你名字的便签:)【参考方案2】:
data[c] += 1;

您向 未初始化 值添加一些内容。在此之前,data[c] 不一定为 0。 new 不会将动态数组初始化为零。

退出所有新/删除并使用 std::vector。而且,一定要学习使用调试器——在这种情况下真的很有帮助。

【讨论】:

以上是关于使用动态数组操作内存中的垃圾的主要内容,如果未能解决你的问题,请参考以下文章

怎么使用new操作符创建动态数组?

动态内存分配

动态内存分配

附加到动态内存中的数组

C语言学习笔记--动态内存分配

在 C++ 中的 2D 动态内存分配数组中释放分配的内存