问题标签 [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.
c++ - 是否可以在不展开调用堆栈的情况下杀死 Windows XP 上的 C++ 应用程序?
我的理解是,当您在 Windows XP 中通过任务管理器终止 C++ 应用程序时,该应用程序仍然“干净”地被破坏 - 即调用堆栈将展开并且所有相关的对象析构函数都将被调用。不确定我的理解是否有误。
是否可以在不展开堆栈的情况下立即终止这样的应用程序?
例如,应用程序可以使用 RAII 模式,当对象被破坏时,这些模式将破坏或释放资源。如果通过任务管理器的传统“终止进程”是正常的,那么提供一种立即终止应用程序的方法将允许我测试不正常的关机(例如断电)。
编辑:
澄清一下,我正在寻找一个允许我这样做的现有实用程序或程序。我应该能够在我没有源代码的程序上使用该解决方案,这意味着编程解决方案实际上是不可接受的。
编辑:
只是为了提供更多上下文,有时我必须使用非常侵入性的第 3 方服务(例如,每隔一小时就唠叨我重新启动)。因为我知道我不需要重新启动,所以我想终止进程/服务,这样它就不会再唠叨我了。不幸的是,一些第 3 方开发人员“聪明”到足以阻止我这样做,当我通过任务管理器终止进程时,系统将立即重新启动(我猜是使用 RAII 来实现这一点)。
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:
c++ - 在逗号运算符的 LHS 中初始化匿名互斥锁持有类实例
假设我有这样的代码:
如果函数test_raiicomma_1
() 是从多个线程调用的,它会锁定一个互斥体以防止任何其他线程同时调用Func()
。互斥体在构造变量时被锁定,mut1_lock
在超出范围并被破坏时释放。
这工作得很好,但作为一种风格,需要为持有锁的临时对象命名让我很恼火。该函数test_raiicomma_2()
试图通过初始化锁对象并Func()
在一个表达式中调用该函数来避免这种情况。
直到表达式结束才调用临时对象析构函数是否正确, afterFunc()
已返回?(如果是这样,你认为使用这个成语是否值得,或者在单独的语句中声明锁总是更清楚?)
如果该函数test_raiicomma_3()
需要锁定两个互斥锁,那么互斥锁在调用之前会按顺序锁定Func()
,然后释放,但不幸的是可能会以任一顺序释放,这是否正确?
c++ - 是否可以防止 RAII 样式的类被“匿名”实例化?
假设我有一个 RAII 风格的 C++ 类:
...在我的代码中像这样使用:
...目标是进入某个状态,做一些事情,然后在我离开那个范围时离开那个状态。有没有办法使这个错字不编译(或警告,或以某种方式抱怨以便注意到错误)?
我不知道 C++ 本身有什么东西可以用来防止这种情况发生,但这并不意味着它不存在。如果 C++ 中没有任何内容,则可以接受特定于编译器的扩展。我主要对任何针对 gcc 和 msvc 的东西感兴趣(有一天 icc,其他编译器的想法很受欢迎,但不太可能有用),因此对它们中的任何一个的 hack 都会很有用(当然,适当地抽象为 #ifdef'd 宏定义) .
c# - C# - 超出范围时对象是否立即销毁?
我可以相信一个对象在 C# 中超出范围时会被销毁并立即调用其析构函数吗?
我认为它应该是因为许多常见的编码实践(例如事务对象)都依赖于这种行为,但我不太习惯使用垃圾收集,并且对这些语言的通常行为方式知之甚少。
谢谢。
inversion-of-control - 控制反转和RAII可以一起玩吗?
我只是在阅读控制反转 (IOC) 的内容,这让我感到困扰,它似乎让内存管理变得很痛苦。当然,似乎 ioc 主要用于垃圾收集环境(Net、Java、脚本),而我关心的是非 gc 设置。
我担心的是 IOC 在某种程度上违背了 RAII,因为我们将资源生命周期与对象生命周期分离。这种增加的复杂性不会打扰其他人吗?真正的问题是,可以使用哪些技术使事情顺利进行?
c++ - 使非对象资源符合 RAII
在我的代码中,我使用HANDLE
s from windows.h
。它们被用作
如您所见,您必须将其插入CloseHandle
到可能在获取和释放过程中发生的每个异常中。因此,您很可能忘记了一个(或者有一个您不知道的花哨的 SEH 异常)并且瞧,您有内存泄漏。
最近,我读到了关于 RAII 的文章,它应该可以消除这种情况下的麻烦,并且应该CloseHandle
自动调用它。我还看到std::auto_ptr<someType>
在 C++ 中有类似的东西可以解决分配给new
.
但是,由于我不使用new
and 因为HANDLE
is just typedef
ed to be a void *
,所以我想知道我应该如何使用std::auto_ptr<someType>
. 不知何故,应该可以给它一个自定义删除函数(if (!CloseHandle(h)) { throw std::exception("closeHandle error"); }
)。创建一个类将是另一种方法,因为每当它的实例超出范围时都会调用析构函数。但是,为每件简单的事情开设一个班级只是过分了。
如何修复这些意外的内存泄漏?
请注意,我更喜欢纯 C++ 中没有库和大依赖项的解决方案,除非它们真的很小并且无论如何都在大多数环境中使用。
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 的正确方法是什么?
c++ - 如何修复堆损坏
我试图构建一个非常简约的内存读取库来读取一些unsigned int
s。ReadUnsignedInt
但是,当方法想要返回时,我遇到了“HEAP CORRUPTION DETECTED”错误消息。
检测到堆损坏。CRT 检测到应用程序在缓冲区结束后写入内存。
正如我所读到的,这可能是尝试双重删除某些内容的原因。这可能是由于一些不正确的使用引起的,std::tr1::shared_ptr
但我无法确定我对它们做错了什么。代码如下(省略错误处理):
c++ - 向句柄包装器添加功能
我有一个 C++ RAII 类,用于使用 boost::shared_ptr<> 管理 Win32 HANDLE,看起来有点像这样:
我想扩展它,而不是写:
我可以写:
最好的方法是使用 CHandle 类作为 CEvent 类的成员吗?
或者,还有更好的方法?(请注意,我仍然想维护 boost::shared_ptr<> 给出的 CHandle 的复制语义。
谢谢,保罗