- 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/
我是 Java 新手,这是我的代码, if( a.name == b.name && a.displayname == b.displayname && a.linknam
在下面的场景中,我有一个 bool 值。根据结果,我调用完全相同的函数,唯一的区别是参数的数量。 var myBoolean = ... if (myBoolean) { retrieve
我是一名研究 C++ 的 C 开发人员: 我是否正确理解如果我抛出异常然后堆栈将展开直到找到第一个异常处理程序?是否可以在不展开的情况下在任何 throw 上打开调试器(即不离开声明它的范围或任何更高
在修复庞大代码库中的错误时,我观察到一个奇怪的情况,其中引用的动态类型从原始 Derived 类型更改为 Base 类型!我提供了最少的代码来解释问题: struct Base { // some
我正在尝试用 C# 扩展给定的代码,但由于缺乏编程经验,我有点陷入困境。 使用 Visual Studio 社区,我尝试通过控制台读出 CPU 核心温度。该代码使用开关/外壳来查找传感器的特定名称(即
这可能是一个哲学问题。 假设您正在向页面发出 AJAX 请求(这是使用 Prototype): new Ajax.Request('target.asp', { method:"post", pa
我有以下 HTML 代码,我无法在所有浏览器中正常工作: 我试图在移动到
我对 Swift 很陌生。我如何从 addPin 函数中检索注释并能够在我的 addLocation 操作 (buttonPressed) 中使用它。我正在尝试使用压力触摸在 map 上添加图钉,在两
我设置了一个详细 View ,我是否有几个 Nib 文件根据在 Root View Controller 的表中选择的项目来加载。 我发现,对于 Nibs 的类,永远不会调用 viewDidUnloa
我需要动态访问 json 文件并使用以下代码。在本例中,“bpicsel”和“temp”是变量。最终结果类似于“data[0].extit1” var title="data["+bpicsel+"]
我需要使用第三方 WCF 服务。我已经在我的证书存储中配置了所需的证书,但是在调用 WCF 服务时出现以下异常。 向 https://XXXX.com/AHSharedServices/Custome
在几个 SO 答案(1、2)中,建议如果存在冲突则不应触发 INSERT 触发器,ON CONFLICT DO NOTHING 在触发语句中。也许我理解错了,但在我的实验中似乎并非如此。 这是我的 S
如果进行修改,则会给出org.hibernate.NonUniqueObjectException。在我的 BidderBO 类(class)中 @Override @Transactional(pr
我使用 indexOf() 方法来精细地查找数组中的对象。 直到此刻我查了一些资料,发现代码应该无法正常工作。 我在reducer中尝试了上面的代码,它成功了 let tmp = state.find
假设我有以下表格: CREATE TABLE Game ( GameID INT UNSIGNED NOT NULL, GameType TINYINT UNSIGNED NOT NU
代码: Alamofire.request(URL(string: imageUrl)!).downloadProgress(closure: { (progress) in
我是一名优秀的程序员,十分优秀!