运行 multiset.erase(std::prev(multiset.end())); 时出现内存错误

问题描述 投票:0回答:1
#include <iostream>
#include <set>
#include <iterator>
using std::cout, std::endl;
using std::multiset;
int main() {
    multiset<int> m;
    m.insert(1);
    m.insert(2);
    m.insert(3);
    m.erase(std::prev(m.end()));
    for (auto &i : m) {
        cout << i << ' ';
    }
    cout << endl;
}

当我使用

g++ -o main main.cpp
编译此代码时,它可以正常工作。但是,当我使用
g++ -fsanitize=address -fsanitize=undefined -fno-sanitize-recover -fstack-protector -o main main.cpp
编译此代码时,大约 10 次运行中有 1 次会弹出
AddressSanitizer:DEADLYSIGNAL

我正在使用

g++ (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0 Copyright (C) 2021 Free Software Foundation, Inc.

代码改编自https://stackoverflow.com/a/19468959/19357263

这是编译器的错误吗?

c++ data-structures stl g++ runtime-error
1个回答
0
投票
当启用地址空间布局随机化 (ASLR)(默认)时,可以引发

AddressSanitizer:DEADLYSIGNAL
。当您运行地址清理程序时,禁用 ASLR 应该可以解决问题:

echo 0 > /proc/sys/kernel/randomize_va_space

完成后,不要忘记重新启用 ASLR 并恢复安全性

echo 2 > /proc/sys/kernel/randomize_va_space
© www.soinside.com 2019 - 2024. All rights reserved.