1
19
你的设计需要做出选择。要么取得所有权并将其删除,要么不取得所有权。 不管怎样,用户都要知道如何使用您的函数。 他们要么需要知道你的功能会破坏图像(并根据需要传递他们自己的副本),要么他们需要足够聪明来管理他们自己的资源。 通常,您不想为了删除它而窃取所有权。所以我愿意 不 删除任何内容。如果有人愚蠢到失去删除他们传递的图像的能力,这不是功能问题。换句话说,你应该试着去保护墨菲,但是忘记保护马基雅维利。
也就是说,原始指针使用不好!贫C++代码的特点是手工资源管理和资源问题。应该在图像周围有一个包装器,它将删除析构函数中的图像。这样你就可以了
从未
泄漏,即使抛出异常。提供一个
听起来您想要共享所有权,所以您需要一个引用计数的资源包装器。然后问题就解决了:如果有人进行了“内联”分配,它将被放入共享指针中,然后在完成分配后自动删除。(更好的是
这是在一个名为
这应该用 全部的 资源。这里的概念是 Scoped-bound Resource Management (SBRM);利用自动(堆栈)变量的生存期规则自动管理资源。它被称为alos,因为它是原始的,但更丑的名字。 Resource-Acquisition Is Initialization (RAII)。对这个领域做一些研究,你会发现你的代码更容易和更清晰。 如果不更改参数的类型,则无法执行此操作。您可以将其更改为:
因为非常量引用只能绑定到左值:
但是,这不允许使用左值的地址。当然,您可以执行以下简单操作:
它起作用了。但我不知道你为什么要这么做。 上面的解决方案将允许您修改参数(因为它是一个引用)。如果要在函数中强制执行const,可以使用如下实用程序:
结果相同,只是函数中有一个常量引用。 请注意,MSVC有一个bug,并接受此错误:
在这两种情况下,即使它不应该(它不接受
|
2
4
不可能有这样的用法区别。在所有情况下,它都是一个有效的参数。我真的不明白你为什么需要这个… |
3
2
所以不要使用指针…使用(左值)引用:
|
4
2
这不是解决你的任务吗? 但我还是推荐类似std::auto-ptr这样的例子。
|
5
-1
C或C++不会给你确定内存分配到什么地方,你的函数的参数。如果你想要更好的安全性,那就在.NET中编程。 如果你想让它更安全,就不要完全改变你的函数签名来接受一个自动指针。这样,语义就变得清晰了,不应该混淆谁或者什么拥有内存。 |
John · 精灵;在C++Allegro 5中更改帧不是流畅的 7 年前 |