【问题标题】:Does it make a sense to use 'new' when creating std::set?创建 std::set 时使用“new”是否有意义?
【发布时间】:2015-07-20 20:43:16
【问题描述】:

请解释一下,接下来的事情。

#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. 为什么在使用 delete a 释放内存后,std::set 的成员仍然可用,并且像 delete a。以及删除成员 a 的正确方法是什么。 谢谢。

【问题讨论】:

标签: c++ set


【解决方案1】:

观看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

【讨论】:

  • 你拼错了“不幸”。
【解决方案2】:

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

delete 之后仍然看到合理值输出的原因是您的 PC 尚未在内存空间中写入新值。这就是为什么在删除内存后尝试访问内存属于“未定义行为”的原因。

【讨论】:

    猜你喜欢
    • 2010-10-08
    • 1970-01-01
    • 2020-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-20
    • 2018-10-31
    • 1970-01-01
    相关资源
    最近更新 更多