问题标签 [raii]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
9 回答
2196 浏览

c++ - 是否可以在不展开调用堆栈的情况下杀死 Windows XP 上的 C++ 应用程序?

我的理解是,当您在 Windows XP 中通过任务管理器终止 C++ 应用程序时,该应用程序仍然“干净”地被破坏 - 即调用堆栈将展开并且所有相关的对象析构函数都将被调用。不确定我的理解是否有误。

是否可以在不展开堆栈的情况下立即终止这样的应用程序?

例如,应用程序可以使用 RAII 模式,当对象被破坏时,这些模式将破坏或释放资源。如果通过任务管理器的传统“终止进程”是正常的,那么提供一种立即终止应用程序的方法将允许我测试不正常的关机(例如断电)。

编辑:

澄清一下,我正在寻找一个允许我这样做的现有实用程序或程序。我应该能够在我没有源代码的程序上使用该解决方案,这意味着编程解决方案实际上是不可接受的。

编辑:

只是为了提供更多上下文,有时我必须使用非常侵入性的第 3 方服务(例如,每隔一小时就唠叨我重新启动)。因为我知道我不需要重新启动,所以我想终止进程/服务,这样它就不会再唠叨我了。不幸的是,一些第 3 方开发人员“聪明”到足以阻止我这样做,当我通过任务管理器终止进程时,系统将立即重新启动(我猜是使用 RAII 来实现这一点)。

0 投票
4 回答
1519 浏览

c++ - Local variable scope question

Why is the following code prints "xxY"? Shouldn't local variables live in the scope of whole function? Can I use such behavior or this will be changed in future C++ standard?

I thought that according to C++ Standard 3.3.2 "A name declared in a block is local to that block. Its potential scope begins at its point of declaration and ends at the end of its declarative region."


Based on the responses I can assume that MyClass(12345); is the expression (and scope). That is make sense. So I expect that the following code will print "xYx" always:

And it is allowed to make such replacement:

0 投票
3 回答
919 浏览

c++ - 在逗号运算符的 LHS 中初始化匿名互斥锁持有类实例

假设我有这样的代码:

如果函数test_raiicomma_1() 是从多个线程调用的,它会锁定一个互斥体以防止任何其他线程同时调用Func()。互斥体在构造变量时被锁定,mut1_lock在超出范围并被破坏时释放。

这工作得很好,但作为一种风格,需要为持有锁的临时对象命名让我很恼火。该函数test_raiicomma_2()试图通过初始化锁对象并Func()在一个表达式中调用该函数来避免这种情况。

直到表达式结束才调用临时对象析构函数是否正确, afterFunc()已返回?(如果是这样,你认为使用这个成语是否值得,或者在单独的语句中声明锁总是更清楚?)

如果该函数test_raiicomma_3()需要锁定两个互斥锁,那么互斥锁在调用之前会按顺序锁定Func(),然后释放,但不幸的是可能会以任一顺序释放,这是否正确?

0 投票
4 回答
662 浏览

c++ - 是否可以防止 RAII 样式的类被“匿名”实例化?

假设我有一个 RAII 风格的 C++ 类:

...在我的代码中像这样使用:

...目标是进入某个状态,做一些事情,然后在我离开那个范围时离开那个状态。有没有办法使这个错字不编译(或警告,或以某种方式抱怨以便注意到错误)?

我不知道 C++ 本身有什么东西可以用来防止这种情况发生,但这并不意味着它不存在。如果 C++ 中没有任何内容,则可以接受特定于编译器的扩展。我主要对任何针对 gcc 和 msvc 的东西感兴趣(有一天 icc,其他编译器的想法很受欢迎,但不太可能有用),因此对它们中的任何一个的 hack 都会很有用(当然,适当地抽象为 #ifdef'd 宏定义) .

0 投票
6 回答
16043 浏览

c# - C# - 超出范围时对象是否立即销毁?

我可以相信一个对象在 C# 中超出范围时会被销毁并立即调用其析构函数吗?

我认为它应该是因为许多常见的编码实践(例如事务对象)都依赖于这种行为,但我不太习惯使用垃圾收集,并且对这些语言的通常行为方式知之甚少。

谢谢。

0 投票
3 回答
446 浏览

inversion-of-control - 控制反转和RAII可以一起玩吗?

我只是在阅读控制反转 (IOC) 的内容,这让我感到困扰,它似乎让内存管理变得很痛苦。当然,似乎 ioc 主要用于垃圾收集环境(Net、Java、脚本),而我关心的是非 gc 设置。

我担心的是 IOC 在某种程度上违背了 RAII,因为我们将资源生命周期与对象生命周期分离。这种增加的复杂性不会打扰其他人吗?真正的问题是,可以使用哪些技术使事情顺利进行?

0 投票
6 回答
768 浏览

c++ - 使非对象资源符合 RAII

在我的代码中,我使用HANDLEs from windows.h。它们被用作

如您所见,您必须将其插入CloseHandle到可能在获取和释放过程中发生的每个异常中。因此,您很可能忘记了一个(或者有一个您不知道的花哨的 SEH 异常)并且瞧,您有内存泄漏。

最近,我读到了关于 RAII 的文章,它应该可以消除这种情况下的麻烦,并且应该CloseHandle自动调用它。我还看到std::auto_ptr<someType>在 C++ 中有类似的东西可以解决分配给new.

但是,由于我不使用newand 因为HANDLEis just typedefed to be a void *,所以我想知道我应该如何使用std::auto_ptr<someType>. 不知何故,应该可以给它一个自定义删除函数(if (!CloseHandle(h)) { throw std::exception("closeHandle error"); })。创建一个类将是另一种方法,因为每当它的实例超出范围时都会调用析构函数。但是,为每件简单的事情开设一个班级只是过分了。

如何修复这些意外的内存泄漏?

请注意,我更喜欢纯 C++ 中没有库和大依赖项的解决方案,除非它们真的很小并且无论如何都在大多数环境中使用。

0 投票
4 回答
7368 浏览

c++ - 使用带有自定义删除器的 shared_ptr 制作符合 HANDLE RAII 的

我最近在SO发布了一个关于 RAII 的一般性问题。但是,我的 HANDLE 示例仍然存在一些实现问题。

AHANDLE被输入到void *in windows.h。因此,正确的shared_ptr定义必须是

示例 1 CreateToolhelp32Snapshot:返回HANDLE和工作。

正如我void在定义中使用的那样(正确的方法是什么?),当我尝试用这个指针调用更多的 winapi 命令时,问题还在继续。它们在功能上有效,但很丑陋,我相信必须有更好的解决方案。

在以下示例中,h是通过顶部定义创建的指针。

示例 2 OpenProcessToken:最后一个参数是 a PHANDLE。演员阵容中等丑陋。

示例 3 Process32First:第一个参数是 a HANDLE。真的很丑。

示例 4与常数的简单比较HANDLE。真的很丑。

为 HANDLE 创建正确的 shared_ptr 的正确方法是什么?

0 投票
4 回答
3482 浏览

c++ - 如何修复堆损坏

我试图构建一个非常简约的内存读取库来读取一些unsigned ints。ReadUnsignedInt但是,当方法想要返回时,我遇到了“HEAP CORRUPTION DETECTED”错误消息。

检测到堆损坏。CRT 检测到应用程序在缓冲区结束后写入内存。

正如我所读到的,这可能是尝试双重删除某些内容的原因。这可能是由于一些不正确的使用引起的,std::tr1::shared_ptr但我无法确定我对它们做错了什么。代码如下(省略错误处理):

0 投票
2 回答
767 浏览

c++ - 向句柄包装器添加功能

我有一个 C++ RAII 类,用于使用 boost::shared_ptr<> 管理 Win32 HANDLE,看起来有点像这样:

我想扩展它,而不是写:

我可以写:

最好的方法是使用 CHandle 类作为 CEvent 类的成员吗?

或者,还有更好的方法?(请注意,我仍然想维护 boost::shared_ptr<> 给出的 CHandle 的复制语义。

谢谢,保罗