创建 std::set 时使用 'new' 有意义吗?

Does it make a sense to use 'new' when creating std::set?

接下来的事请给我解释一下。

#include <iostream>
#include <set>

int main() {
    std::set<int>* a = new std::set<int>;

    a->insert(2);
    a->insert(5);

    for ( std::set<int>::iterator it = a->begin(); it != a->end(); it++ ) {
        std::cout << *it << std::endl;
    }

    std::cout << "Deleting a....." << std::endl;

    delete a;

    for ( std::set<int>::iterator it = a->begin(); it != a->end(); it++ ) {
        std::cout << *it << std::endl;
    }


    return 0;
}

$ g++ test6.cpp && a
2
5
Deleting a.....
2
5
3544585
  1. 使用运算符 new 创建 std::set 是否有意义?正如我在手册中读到的,std::set 有自己的分配器对象,它负责使用运算符 new 进行动态内存分配。但了解有经验的成员的观点很有趣。
  2. 为什么在使用 delete a 释放内存后,std::set 的成员仍然可用并且像以前一样具有值 2 和 5 删除一个。删除成员 a 的正确方法是什么? 谢谢。

不,标准库包含内存管理功能,因此程序员不必关心这个。

您在 delete 之后仍然看到合理值输出的原因是您的 PC 尚未在内存空间写入新值。这就是为什么在删除内存后尝试访问内存属于 "undefined behavior" 范畴。

观看 this part Stroudstrup 在 Going Native 2013 上的演讲

1) 不行,你可以只创建一个局部变量a,让它在函数结束时通过正常的控制流释放

std::set<int> a;
a.insert(2);
a.insert(5);

2) 你走运了。访问已释放的内存是未定义的行为。 运行 此代码通过 valgrind,您会看到错误。

int *ip = new int{1};
delete ip;
int a = *ip; // NOT SAFE, maybe 1, maybe 24630751, maybe crash