从函数main调用时对未初始化的成员变量myMap的使用

编程语言 2026-07-12

最小可复现示例(MRE):

#include <unordered_map>
#include <string>

class MyClass {
private:
    std::unordered_map<std::string, int> myMap;

public:
    MyClass()
        : myMap() {}
};

int main()
{
    // Create a MyClass object on the heap
    const auto* my_class = new MyClass();
    delete my_class;
}

我难以理解为什么会有这个警告(在CLion)

Usage of non-initialized class field 'myMap' when called from function 'main'

我甚至在初始化列表中加入myMap以防万一,但没用。奇怪的是,一旦设定容量,警告就会消失。

证明

没有容量: 在此处输入图片描述 有容量: 在此处输入图片描述

我有

set(CMAKE_CXX_STANDARD 23)

在我的CMakeLists.txt中

cmake_minimum_required(VERSION 3.30)

在栈上创建对象也会在CLion中产生相同的警告:

#include <unordered_map>
#include <string>

class MyClass {
private:
    std::unordered_map<std::string, int> myMap;

public:
    MyClass()
        : myMap() {}
};

int main()
{
    const MyClass my_class{};
}

解决方案

IDE的警告是一个 误报,因为 new MyClass() 将导致值初始化,而这在这里将使用默认构造函数,默认构造函数已经通过成员初始化列表正确初始化数据成员 myMap


在第二种情况中,你也使用 const MyClass my_class{};,我们有列表初始化,在这种情况下也会使用默认构造函数,因此这里的 myMap 数据成员也被初始化。

我们100% 确定这是误报吗?

是的。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章