为什么用三元if初始化一个类会导致无双?

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

当使用clang编译以下代码并启用clang-analyzer时。

#include <stdlib.h>
struct Buffer {
    unsigned char *buf;
    Buffer() : buf(0) {}
    Buffer(const Buffer &that) {
        buf = new unsigned char;
        *buf = *that.buf;
    }
    Buffer(Buffer &&);
    ~Buffer() { delete buf; }
    Buffer &operator=(const Buffer &that) = delete;
    Buffer &operator=(Buffer &&that) = delete;
};

Buffer func() {
    Buffer a;
    return a;
}

int main() { Buffer a = 1 ? func() : Buffer(); }

使用命令:

scan-build clang++ main.cc -std=c++17

产生了以下错误。

main.cc:10:17: warning: Attempt to free released memory
    ~Buffer() { delete buf; }

然而,当初始化 aBuffer a = func(); (不含三元if),错误就会消失。此外,使用 -std=c++11 也使错误消失。

为什么会出现这种情况?

c++ memory destructor clang++
1个回答
0
投票

由于使用了move构造函数,但没有定义,这违反了一定义规则,所以程序是畸形的。程序中的这个bug可能会造成扫描器诊断为假阳性。

复制构造函数没有被使用,但它被破坏了,因为它有可能通过一个空指针间接。

© www.soinside.com 2019 - 2024. All rights reserved.