- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有以下代码:
void do_something(Image *image)
{
Image *smoothed = NULL;
Image *processed = NULL;
if (condition_met) {
smoothed = smooth(image);
processed = smoothed;
}
else {
processed = image;
}
...
delete smoothed_image
}
我想知道我是否可以执行以下操作,这是否是正确的方法。我对从 auto_ptr 对象设置另一个指针以及这是否会以某种方式改变所有权感到困惑。
void do_something(Image *image)
{
auto_ptr<Image *> smoothed;
Image *processed = NULL;
if (condition_met) {
smoothed = smooth(image); // This should own the pointer returned by smooth
processed = smoothed; // Is this OK? processed is not an auto_ptr
}
else {
processed = image;
}
...
// Destructor for the 'smoothed' variable should be called.
// The 'image' variable is not deleted.
}
析构函数会按照我的预期被调用吗?这是执行此操作的正确方法吗?
最佳答案
有几点要说明。假设平滑函数的签名是
Image* smooth(Image*);
那么您的代码至少需要更改为
void do_something(Image *image)
{
auto_ptr<Image> smoothed;
Image *processed = NULL;
if (condition_met) {
smoothed.reset(smooth(image)); // This should own the pointer returned by smooth
processed = smoothed.get(); // Maybe? Depends on what you're doing
}
else {
processed = image;
}
在某些情况下,像上面的 smoothed.get()
所做的那样,将原始指针从智能指针中拉出来是合理的,但你必须理解 < strong>smoothed 将在函数结束时被删除,即使你已经用原始指针做了其他事情。这里没有足够的信息来判断这是否是一个问题,但它是一种气味。
std::auto_ptr 现已弃用,取而代之的是 std::unique_ptr。主要原因是 auto_ptr 内容的移动方式:
std::auto_ptr<int> a = new int(5);
std::auto_ptr<int> b = a; // Copy? No!
在这段代码中,a 持有的指针已被转移到 b。 a 不再持有任何东西。这与我们通常认为的复制行为背道而驰,因此很容易搞砸。
C++11 引入了右值引用的概念(网络上有大量文章对此进行解释,包括 What are move semantics? )。拥有右值引用允许 unique_ptr 防止数据被移动到没有意义的地方。
std::unique_ptr<int> a = new(5);
std::unique_ptr<int> b = a; // Compile fail. Not copyable
std::unique_ptr<int> c = std::move(a); // OK, shows intent
有了这个,就可以将您的 smooth() 函数签名更新为
std::unique_ptr<Image> smooth(Image*) {
...
return newImage;
}
这清楚地指示调用者他们应该取得返回指针的所有权。现在你可以说
unique_ptr<Image> smoothed;
...
smoothed = smooth(image);
因为从函数返回的值是右值(尚未绑定(bind)到变量),指针被安全地移动到平滑。
最后,是的,使用智能指针比调用delete 更可取。仔细考虑您的设计并尝试弄清楚指针所有权。
关于c++ - 在这种情况下如何使用 auto_ptr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27016117/
我正在处理一些必须返回 std::auto_ptr 的旧代码,我的经验相对较少。我遇到过这样的情况: // I need to populate this function std::auto_ptr
Nicolai Josuttis 在他的书“The C++ Standard Library - A Tutorial and Reference”中,在第 44 页的以下段落中写道: Accordi
请帮助我理解以下问题。 请看下面的代码示例: #include class Shape { public: virtual wchar_t *GetName() { return L"Shape
我正在尝试创建一个将 auto_ptr 带到 Base 类的函数,我想用一个 auto_ptr 来调用它 派生类。但是我没能完成它。 我试过在没有引用的情况下使用它: void function(st
我在使用 std::auto_ptr 时遇到问题.我尝试使用 GCC 4.6.1 在 Ubuntu 11.10 上编译以下内容,我收到错误消息 error: no match for call to
我有以下代码: void do_something(Image *image) { Image *smoothed = NULL; Image *processed = NULL;
那么,如果释放 auto_ptr 拥有的对象但实际上并未将其分配给原始指针,指针会发生什么情况?似乎它应该被删除,但它永远没有机会。那么它是否会“泄露到野外”? void usingPointer(i
如果我有一个 auto_ptr,我可以将它传递给引用吗?比如: auto_ptrClass(new MyClass); void SetOponent(MyClass& oponent); //So
我正在阅读 an article关于有效使用 auto_ptr。在那里,建议将以下代码作为正确的代码段: // Example 10(c): Correct (finally!) // auto_pt
如果我有课 template struct C { ... private: auto_ptr ptr; }; 如何为 C 定义复制构造函数: 不可能 template C::C(const
auto_ptr 是否与指针大小相同? 我必须用 boost::scoped_ptr 代替它,我想知道这两种数据类型是否具有相同的大小。 最佳答案 只需执行以下操作,您就可以很容易地找出尺寸: #in
这是我的程序的示例代码。在这里,我使用 std::auto_ptr 动态分配内存并输入值(在函数中),之后我再次为同一个变量分配内存。因此,当为相同的新内存分配时,以前分配的内存将被释放。我对此表示怀
我知道这个: #include class A; class B { public: B(A* a) : a_(a) {} private: std::auto_pt
我将 auto_ptr 初始化为 NULL,稍后在游戏中我需要知道它是否为 NULL 以返回它或一个新拷贝。 我试过了 auto_ptr ret = (mReqContext.get() != 0)
我试图了解有关 auto_ptr 类如何工作的某些细节。假设您有以下类(class)(我是在一个网站上找到的,该网站上有人解释了赋值运算符的要点)。 class TFoo : public TSupe
我不太清楚 auto_ptr 在这种情况下是否会帮助我: class A { A(const B& member) : _member(B) {}; ... const B& _me
在我的代码中,我使用 new 分配一个整数数组。之后,我将这个指针包装到一个 auto_ptr 中。我知道 auto_ptr 会自动调用它的析构函数。由于我的 auto_ptr 指向一个数组(使用 n
考虑以下代码: #include struct A { std::auto_ptr i; }; A F() { A a; return a; } int main(int ar
除了使用 auto_ptr 的所有已知好处之外,auto_ptr 的“最坏做法”是什么? 创建 auto_ptr 的 STL 约束器。auto_ptr 不满足“CopyConstructable”要求
偶尔,对于转瞬即逝的时刻,我认为 auto_ptr 很酷。但大多数时候,我认识到有更简单的技术可以让它变得无关紧要。例如,如果我想自动释放一个对象,即使抛出异常,我也可以新建该对象并分配给一个 aut
我是一名优秀的程序员,十分优秀!