C++中的警告:指针包含一个值,在尝试分配新int32_t时必须检查该值

Warning in C++: Pointer holds a value that must be examined when trying to assign new int32_t

提问人:Abhinav Jha 提问时间:12/6/2021 更新时间:12/6/2021 访问量:652

问:

我正在尝试学习 C++ 中的动态内存分配。 我的程序可以编译并工作,但 Visual Studio 向我抛出这些警告。

它们是什么意思?

Warning C28193  'ptr' holds a value that must be examined.
Warning C28182  Dereferencing NULL pointer. 'ptr' contains the same NULL value as 
'new(1*4, nothrow)'

我的代码:

#include <iostream>
#include <cstdint>

int main()
{
    int* ptr = nullptr;

    if (!ptr) {
        ptr = new (std::nothrow) int32_t;
        *ptr = 10;
    }

    std::cout << *ptr << "\n";

}
C++ 指针 警告 dynamic-memory-allocation new-operator

评论

0赞 Salvage 12/6/2021
你们的编译器选项是什么?使用标准设置时,在 gcc、clang 或 msvc 上未收到警告。
0赞 Abhinav Jha 12/6/2021
我是一个完全的初学者,所以它就是标准的 VS 设置。唯一的区别是我使用的是 C++20。

答:

7赞 Ron Beyer 12/6/2021 #1
new (std::nothrow) int32_t

尝试为 分配内存,如果不能,则不会抛出异常,而是返回 。int32_tnullptr

您可以继续为其分配一个数字 (10),但您需要首先通过在分配值之前检查是否为 nullptr 来确定内存分配是否成功。它试图告诉你,你需要一些错误检查。ptr

同样的事情,当你把它打印出来时,它可能是一个空,你需要检查它。

评论

0赞 Abhinav Jha 12/6/2021
所以我应该添加一个检查它是否是,如果不是,则只打印,对吧?ifNULL
1赞 bolov 12/6/2021
@AbhinavJha我只是想.如果内存分配失败,则除了关闭应用程序外,您无能为力。exit()
0赞 Ron Beyer 12/6/2021
@AbhinavJha 是的,类似或其他类型的恐慌。if (ptr == nullptr) exit();
0赞 Salvage 12/6/2021
在那种情况下,我一开始就不会使用?除非我错过了什么。std::nothrow
1赞 bolov 12/6/2021
@Salvage某些环境没有例外。