C++ 项目,出现了匪夷所思的 bug,在 vector 中添加对象,会导致 vector 崩溃,进而整个程序崩溃。

查看 82|回复 5
作者:villivateur   
这个项目很大,我修改了其中一部分代码,出现了一个非常匪夷所思的问题:
这个是出问题的函数:
void SetModuleIdentities(std::vector[u]& identities)
{
        std::vector testVec;
        for (uint32_t const& identity : identities)
        {
                printf("enter... testVec.size=%ld %ld\n", testVec.size(), testVec.capacity());
                ModuleConfig newModule;
                newModule.identity = identity;
                testVec.push_back(newModule);
                printf("leave... testVec.size=%ld %ld\n", testVec.size(), testVec.capacity());
        }
}
这是 ModuleConfig 的定义:
struct ModuleConfig
{
        ModuleConfig()
        {
                printf("ModuleConfig::constructor\n");
        }
        ~ModuleConfig()
        {
                printf("ModuleConfig::destructor\n");
        }
   
        uint32_t identity;
        std::string pdoMapName;
        uint32_t pdoMapInOffset;
        uint32_t pdoMapOutOffset;
};
执行的输出如下:
enter... testVec.size=0 0
ModuleConfig::constructor
leave... testVec.size=3353953467947191204 1
ModuleConfig::destructor
# 然后就崩溃了
这是部分调用栈信息(来源 sighandler ):
15:03:36  ecpanda exit with 11
crash time:Thu May 18 15:03:36 2023
./base/lib-linux/bin/ecpanda-generic(_Z10sigHandleriP9siginfo_tPv+0x96) [0x56266aff3e9a]
/lib/x86_64-linux-gnu/libpthread.so.0(+0x14420) [0x7f528d9d7420]
/lib/x86_64-linux-gnu/libc.so.6(cfree+0x20) [0x7f528d50b6f0]
./base/lib-linux/bin/ecpanda-generic(_ZN12ModuleConfigD1Ev+0x2c) [0x56266b0075e6]
./base/lib-linux/bin/ecpanda-generic(_ZN15SlaveFileConfig19SetModuleIdentitiesERSt6vectorIjSaIjEE+0x136) [0x56266b017138]
./base/lib-linux/bin/ecpanda-generic(_Z23ESI_SetModuleIdentitiesiRSt6vectorIjSaIjEE+0x42) [0x56266b01692c]
我就 push_back 了一下,怎么就把 vector 干崩了呢?

vector, uint32_t, lib-linux, printf

nuk   
因为你的 newModule 是分配在栈上的吧
villivateur
OP
  
@nuk 分配在栈上,也没啥影响吧? push_back 会做一次 copy 的
C47CH   
用 compiler explorer 跑了下,没问题
pagxir   
这里的拷贝构造函数不能省吧。
Rothschild   
compiler explorer 没有问题,所以是其他部分 bug
您需要登录后才可以回帖 登录 | 立即注册

返回顶部