有没有办法在运行时区分以下两种情况:
double ptr * = new double(3.14159);
double variable = 3.14159
double * testPtr_1 = ptr;
double * testPtr_2 = &variable;
delete testPtr_1 // fine...
delete testPtr_2 // BIG RUN TIME ERROR !!!
Run Code Online (Sandbox Code Playgroud)
我发现自己陷入困境,我需要调用delete操作符来获取一些未知指针.指针可以指向任何位置(指向"本地"变量或动态分配的变量).
我怎样才能找到我的"未知"指针指向的位置,因此选择何时何时不要调用operator delete它
编辑:
好的我看到每个人都指着智能指针,但如果我想写自己的指针怎么办?一套智能指针(这是我的问题背后的原因)?
无法测试指针是否指向可以删除的内存区域.此外,
deletevs 一起释放delete[],您应采取的方法是通过其他方式跟踪分配/解除分配,例如将标记与指针一起存储.然而,这是相当繁琐的:更好的做法是切换到智能指针,这将为您跟踪资源.
您需要为自己(或您的项目)设置一些更好的编码实践.
特别是因为大多数平台至少都有符合C++ 11标准的编译器,所以没有理由不使用以下范例:
T*)应仅用作非拥有指针.如果您收到T*函数或构造函数的输入,则应该假定您没有责任删除它.如果您有一个实例或局部变量T*,您应该假定您没有责任删除它.std::unique_ptr<T>)应该用作单一所有权指针,一般来说,这些应该是您需要动态分配内存的任何情况的默认选择.std::make_unique<T>()应该首选创建任何类型的唯一指针,因为这可以防止您看到正在使用的原始指针,并且它可以防止您在原始帖子中描述的问题.std::shared_ptr<T>和std::weak_ptr<T>)应该仅用于逻辑上正确的对象的多个所有者.顺便说一句,这些情况的发生频率低于您的想象!std::make_shared<T>()是出于同样的原因创建共享指针的首选方法std::make_unique,也是因为std::make_shared可以对分配执行一些优化,从而提高性能.std::vector<T>)应该用于需要将多个对象分配到堆空间的情况,就像调用一样new T[size].除非在非常奇特的情况下,否则没有理由使用指针.它应该不用说,你需要我"的规则只有做'X’"用一粒盐:有时候,你必须打破这些规则,你可能会在你需要一组不同的情况规则.但是对于99%的用例,这些规则是正确的,并且最好地传达了防止内存泄漏和正确推理代码行为所需的语义.
| 归档时间: |
|
| 查看次数: |
144 次 |
| 最近记录: |