首页 > 解决方案 > 即使指针的 cout 指向内存地址,也显示“取消引用 null ptr”的代码。_malloca 用于分配内存

问题描述

#include <iostream>

int main()
{
    int v = 2;
    int* arr = (int*)_malloca(v * sizeof(int));
    arr[0] = 200; //shows dereferencing null ptr
    std::cout << *arr;
}

我曾经_malloca()在堆栈上进行动态数组的内存分配(我知道向量在那里,我只是想尝试使用_malloca)。我只是想知道它是如何工作的,但与new此不同的是,它会给出取消引用警告,并且不会在此处导致运行时错误。它arr有一个内存地址,甚至接收值并打印它们。我错过了什么?

Visual Studio 屏幕截图

标签: c++allocation

解决方案


答案由@NateEldredge 给出

这是一个警告。_malloca如果分配失败,则可以返回NULL,并且您的代码不会对此进行测试。这是说它可能会取消引用空指针。

所以我添加了一个 if 语句来检查NULL. 此外,在调试模式下_malloca总是在堆中分配内存。因此,还要检查发布模式下的代码。

#include <iostream>

int main()
{
    int v = 4;
    int* arr = (int*)_malloca(v * sizeof(int));
    if(arr != NULL) //a check is required if _malloca was able to allocate memory
        for (int i = 0; i < v; i++)
        {
            arr[i] = i * 2;
            std::cout << arr[i]<<"\n";
        }
    _freea(arr); //freeing the memory 
}

推荐阅读