草庐IT

c++ - 如何防止通过 'new' 运算符分配类? (我想确保我的 RAII 类始终分配在堆栈上。)

我想确保我的RAII类始终分配在堆栈上。如何防止通过“new”运算符分配类? 最佳答案 您需要做的就是将类的新运算符声明为私有(private):classX{private://Preventheapallocationvoid*operatornew(size_t);void*operatornew[](size_t);voidoperatordelete(void*);voidoperatordelete[](void*);//...//TherestoftheimplementationforX//...};将“operat

c++ - RAII 与异常

我们在C++中使用RAII的次数越多,我们发现自己使用的析构函数就越多,这些析构函数会进行非平凡的释放。现在,解除分配(最终确定,但你想调用它)可能会失败,在这种情况下,异常确实是让楼上的任何人知道我们的解除分配问题的唯一方法。但是话又说回来,抛出析构函数是一个坏主意,因为在堆栈展开期间可能会抛出异常。std::uncaught_exception()让您知道何时发生这种情况,但仅此而已,因此除了让您在终止前记录消息之外,您无能为力,除非您愿意离开您的处于未定义状态的程序,其中一些东西被释放/最终确定,而另一些则没有。一种方法是使用无抛出析构函数。但在许多情况下,这只是隐藏了一个真正的

c++ - RAII 与异常

我们在C++中使用RAII的次数越多,我们发现自己使用的析构函数就越多,这些析构函数会进行非平凡的释放。现在,解除分配(最终确定,但你想调用它)可能会失败,在这种情况下,异常确实是让楼上的任何人知道我们的解除分配问题的唯一方法。但是话又说回来,抛出析构函数是一个坏主意,因为在堆栈展开期间可能会抛出异常。std::uncaught_exception()让您知道何时发生这种情况,但仅此而已,因此除了让您在终止前记录消息之外,您无能为力,除非您愿意离开您的处于未定义状态的程序,其中一些东西被释放/最终确定,而另一些则没有。一种方法是使用无抛出析构函数。但在许多情况下,这只是隐藏了一个真正的

c++ - C++ 中的 RAII 和智能指针

在C++实践中,什么是RAII,什么是smartpointers,这些是如何在程序中实现的,使用带有智能指针的RAII有什么好处? 最佳答案 RAII的一个简单(可能是过度使用)示例是File类。如果没有RAII,代码可能如下所示:Filefile("/path/to/file");//Dostuffwithfilefile.close();换句话说,我们必须确保在完成文件后将其关闭。这有两个缺点-首先,无论我们在哪里使用File,我们都必须调用File::close()-如果我们忘记这样做,我们会比需要的时间更长地保留文件。第二个

c++ - C++ 中的 RAII 和智能指针

在C++实践中,什么是RAII,什么是smartpointers,这些是如何在程序中实现的,使用带有智能指针的RAII有什么好处? 最佳答案 RAII的一个简单(可能是过度使用)示例是File类。如果没有RAII,代码可能如下所示:Filefile("/path/to/file");//Dostuffwithfilefile.close();换句话说,我们必须确保在完成文件后将其关闭。这有两个缺点-首先,无论我们在哪里使用File,我们都必须调用File::close()-如果我们忘记这样做,我们会比需要的时间更长地保留文件。第二个

c++ - 为什么将 std::auto_ptr<> 与标准容器一起使用是错误的?

为什么用std::auto_ptr会出错用标准容器? 最佳答案 C++标准规定STL元素必须是“可复制构造的”和“可赋值的”。换句话说,一个元素必须能够被分配或复制,并且这两个元素在逻辑上是独立的。std::auto_ptr不满足这个要求。以这段代码为例:classX{};std::vector>vecX;vecX.push_back(newX);std::auto_ptrpX=vecX[0];//vecX[0]isassignedNULL.要克服这个限制,您应该使用std::unique_ptr,std::shared_ptr或s

c++ - 为什么将 std::auto_ptr<> 与标准容器一起使用是错误的?

为什么用std::auto_ptr会出错用标准容器? 最佳答案 C++标准规定STL元素必须是“可复制构造的”和“可赋值的”。换句话说,一个元素必须能够被分配或复制,并且这两个元素在逻辑上是独立的。std::auto_ptr不满足这个要求。以这段代码为例:classX{};std::vector>vecX;vecX.push_back(newX);std::auto_ptrpX=vecX[0];//vecX[0]isassignedNULL.要克服这个限制,您应该使用std::unique_ptr,std::shared_ptr或s

c++ - 资源获取即初始化 (RAII) 是什么意思?

ResourceAcquisitionisInitialization(RAII)是什么意思? 最佳答案 对于一个非常强大的概念来说,这是一个非常糟糕的名字,也许是C++开发人员在切换到其他语言时最想念的第一件事。尝试将这个概念重命名为Scope-BoundResourceManagement的运动已经发生了一些变化,尽管它似乎还没有流行起来。当我们说“资源”时,我们不仅仅指内存——它可以是文件句柄、网络套接字、数据库句柄、GDI对象……简而言之,我们的资源有限,因此我们需要能够控制它们的使用。“范围绑定(bind)”方面意味着对象

c++ - 资源获取即初始化 (RAII) 是什么意思?

ResourceAcquisitionisInitialization(RAII)是什么意思? 最佳答案 对于一个非常强大的概念来说,这是一个非常糟糕的名字,也许是C++开发人员在切换到其他语言时最想念的第一件事。尝试将这个概念重命名为Scope-BoundResourceManagement的运动已经发生了一些变化,尽管它似乎还没有流行起来。当我们说“资源”时,我们不仅仅指内存——它可以是文件句柄、网络套接字、数据库句柄、GDI对象……简而言之,我们的资源有限,因此我们需要能够控制它们的使用。“范围绑定(bind)”方面意味着对象

c++ - 如果你不应该在析构函数中抛出异常,你如何处理其中的错误?

大多数人说从不从析构函数中抛出异常——这样做会导致未定义的行为。Stroustrup指出"vector析构函数显式调用每个元素的析构函数。这意味着如果元素析构函数抛出,vector销毁失败......确实没有很好的方法来防止析构函数抛出异常,所以库不保证元素析构函数是否抛出”(来自附录E3.2)。Thisarticle似乎另有说法-抛出析构函数或多或少是可以的。所以我的问题是——如果从析构函数中抛出导致未定义的行为,你如何处理析构函数期间发生的错误?如果在清理操作过程中出现错误,你会忽略它吗?如果它是一个可以在堆栈中处理但在析构函数中不正确的错误,那么从析构函数中抛出异常是否有意义?显