有没有更惯用的方法来替换指针
Is there a more idiomatic way of replacing a pointer?
考虑以下代码:
#include <memory>
#include <stdio.h>
#include <stdexcept>
class Foo {
public:
Foo(int n) { val =n; printf("Hi %dn", val); };
~Foo() { printf("Bye %dn", val); };
private:
int val;
};
int main()
{
std::shared_ptr<Foo> p = nullptr; // I don't know what I want yet
p = std::make_shared<Foo>(1); // OK, I've decided
// I've changed my mind, it needs to be something else
p = nullptr;
p = std::make_shared<Foo>(2);
return 0;
}
其输出为:
Hi 1
Bye 1
Hi 2
Bye 2
这是一个人为的例子。福是一个相当乏味的人。它只是打印出有关其寿命的信息。
代码背后的逻辑是:我声明p,但我不知道它最初应该是什么。然后我决定我知道它是什么:它应该取值1。在我的真实代码中,这个值可能会持续很长时间。
过了一段时间,我决定它不应该是1,应该是2。因此,无论以前是什么,都应该被摧毁,取而代之。
到目前为止,我的理解是,上面的代码在内存管理方面很好,在异常情况下也很健壮。
有没有更惯用的说法:
p = nullptr;
p = std::make_shared<Foo>(2);
我不能只写最后一行,因为我想说,我以前拥有的东西需要被摧毁。
只给指针赋值就足以通知您不需要以前的值。你不能说它是否应该被销毁,因为它是一个共享的指针,可能有其他所有者。
在我看来,仅仅分配就足够了,但你可能更喜欢使用shared_ptr::reset()
。
既然你想要惯用的(好!),那就让我们习惯吧:
#include <memory>
#include <stdexcept>
#include <iostream>
class Foo {
public:
Foo(int n)
: val(n)
{
std::cout << "Hi " << val << "n";
};
~Foo() {
std::cout << "bye " << val << "n";
};
private:
int val;
};
int main()
{
auto p = std::shared_ptr<Foo>(); // I don't know what I want yet
p = std::make_shared<Foo>(1); // OK, I've decided
// I've changed my mind, it needs to be something else
p = std::make_shared<Foo>(2);
return 0;
}
这里没有其他需要做的事情
p = std::make_shared<Foo>(2);
如果p中的上一个对象是对该对象的最后一次引用,则此行将破坏该对象。然后,它将新的shared_ptr分配给具有新值的p
相关文章:
- 模板参数推导/替换失败,lambda作为函数指针
- 如何在C++代码中灵活使用和替换标准::shared_ptr或标准::unique_ptr或原始指针?
- 如何在不更改现有函数语法的情况下将普通指针替换为共享指针
- 使用malloc和指针替换矩阵中的向量
- 优化替换共享指针内容时对分配器的调用
- 在 C++11 中将函数指针替换为模板
- C++正则表达式库,替换为函数指针
- 引用可以替换指针吗?
- 搜索并替换为指针
- 有没有更惯用的方法来替换指针
- 使用指针将输入中的空格替换为破折号符号
- 用指针替换循环索引器有什么好处吗?
- 我是否可以使用用户定义的转换将原始指针访问替换为通过类访问
- 在字符指针中用内存移动替换字符
- C++:将'this'指针与"get"函数一起使用以替换 cout 语句的可能性
- 将参数中的静态函数指针替换为实例中方法的指针
- 替换共享指针的内容
- C++程序员用C#中的指针替换
- 如何在c++中用引用替换指针
- 替换指针数组的元素