为什么malloc这么大的内存会出现访问内存错误?

问题描述 投票:0回答:1

正如你所看到的,当我运行它时,我遇到了内存访问错误。但是如果 我将malloc_size更改为100,它可以工作。如何在不更改 malloc_size 的情况下修复它。

int malloc_size = 900000;
float* ptr = (float *)malloc(malloc_size);


for (int i = 0; i< malloc_size; i ++) {

    ptr[i] = 0;
}
c++ windows memory-leaks malloc large-data
1个回答
0
投票

malloc
接受要分配的字节数作为参数。 为了简单起见,假设您的
malloc_size
为 100。

for 循环迭代 while

i < malloc_size
可能会超出该限制,因为在内部,您正在访问
ptr[i] = 0;
ptr
是指向
float
的指针,它很可能有四个字节大。这意味着
ptr[i]
访问偏移量
i * sizeof(float)
i * 4
处的字节。当
i
达到 25 时,您将访问偏移量
25 * 4 = 100
处的字节,即超出末尾的一个。

越界访问数组是未定义的行为,在您的情况下,它会导致程序崩溃。

C++ 建议

由于这个问题被标记为,我也建议根本不要使用

malloc
。 更好的选择是
new

float* ptr = new float[100] {}; // array of size 100
                                // all elements are initialized to zero
// ...
delete ptr;

您仍然需要使用

new
delete
手动管理内存,因此使用
std::vector
会更容易:

std::vector<float> vec(100); // vector of size 100
                             // all elements are initialized to zero
// no need to free/delete
© www.soinside.com 2019 - 2024. All rights reserved.