使用' new'是否有意义?什么时候创建std :: set?

时间:2015-07-20 20:43:16

标签: c++ 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有自己的Allocator对象,它负责使用运算符 new 进行动态内存分配。但有兴趣了解有经验的成员观点。
  2. 为什么在使用 删除 std :: set成员后释放内存仍然可用,并且像 删除a之前一样具有值2和5 / EM> 即可。删除成员 a 的正确方法是什么? 感谢。

2 个答案:

答案 0 :(得分:2)

观看2013年Going Native的Stroudstrup演讲中的this part

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

答案 1 :(得分:1)

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

您仍然在delete之后看到合理值输出的原因是因为您的PC尚未在内存空间上写入新值。这就是为什么在删除内存之后尝试访问内存的原因是&#34;未定义的行为&#34;伞。