草庐IT

atomic_long_try_cmpxchg_acquire

全部标签

c++ - Try/Catch block 替换了析构函数中的方法 block

我最近的任务是查找我们部分代码中的内存泄漏。泄漏最终出现在特定对象的析构函数中……我发现了一些非常奇怪的东西。一位前同事写道:File::~File()try{Clear();}catch(...){Log("caughtexception");}文件类继承自一些基类。我的第一个问题是:这是严格合法的C++吗?它在VisualStudio2008中编译,但我向几个friend/同事展示了它,他们对它的工作感到非常震惊。它实际上并没有按预期工作,但是:这个对象继承的基类有一个现在永远不会调用的析构函数(相反,如果你只是将析构函数包装在一个常规方法block中,让try/catch作为该方

c++ - (signed) long long 的真正下限是多少?

使用longlong检查类型的限制std::cout::min();我得到-9223372036854775808但是在编译以下代码时:intmain(){longlongl;l=-9223372036854775808LL;}我收到警告:test.cpp:3:7:warning:integerconstantissolargethatitisunsigned.test.cpp:3:warning:thisdecimalconstantisunsignedonlyinISOC90我错过了什么?非常感谢您的帮助。乔治 最佳答案 这个9

c++ - std::atomic 加载方法在与 std::shared_ptr 一起使用时减少引用计数

我想使用std::atomic在我的代码中,以便可以自动更新shared_ptr,但是在访问shared_ptr时我遇到了问题。atomic上的load()方法似乎减少了shared_ptr上的引用计数,因此我无法在不释放对象的情况下实际使用该对象。这是显示问题的一段简化代码...typedefshared_ptrMyClassPtr;typedefatomicMyClassAtomicPtr;//1.MyClassPtrptr(newMyClass());printf("1.use_count=%d\n",ptr.use_count());//2.MyClassAtomicPtrat

C++ double 到 long long

如果我用c++写代码:longlongd=999999998.9999999994;cout我得到输出:999999999(四舍五入)但是这段代码的输出:longlongd=999999998.9999994994;cout是999999998(向下舍入)跟精度有关系吗?有什么办法可以改变精度。floor()函数也给出相同的输出。我还注意到,如果我将值8.9999994994或8.9999999994分配给d(上述变量)。输出为8。 最佳答案 999999998.9999999994不能用double精确表示,因此实际值是99999

c++ - 错误 C2280 : attempting to reference a deleted function (atomic<int>)

我有一个classA带有成员变量_atomicVar类型std::atomic.#includeclassA{public:A();~A();private:std::atomic_atomicVar;};如果我构建项目,我会收到以下错误:errorC2280:'std::atomic::atomic(conststd::atomic&)':attemptingtoreferenceadeletedfunction我主要是一名C#开发人员,所以我还不了解C++的每个细节(还)。我不知道我在哪里使用atomic的复制代码.我还尝试初始化_atomicVar:std::atomic_ato

c++ - std::abs 为 "unsigned long long int"数据类型

为什么会出现这个错误C2668:'abs':ambiguouscalltooverloadedfunction像这样简单的代码#include#includeintmain(){unsignedlonglonginta=10000000000000;unsignedlonglongintb=20000000000000;std::cout删除std::后错误仍然存​​在。但是,如果我使用int数据类型(具有较小的值),则没有问题。传统的解决方案是手动检查std::cout这是唯一的解决方案吗? 最佳答案 检查似乎是唯一真正好的解决方

c++ - 是否可以在不同的类中编写/包装异常处理组件(try、catch)?

这是关于将异常处理逻辑包装在某种类中。在写c++的时候代码,很多时候我们需要根据客户端抛出的异常捕获许多类型/变体。这导致我们在catch()子句中编写类似类型的代码(多次)。在下面的示例中,我编写了function(),它可以以多种可能的形式抛出异常。我想知道是否有可能以类的形式编写/包装这样的逻辑,以便最终用户必须一次编写类似类型的代码?有什么意义吗?#include#include#include#include//thisfunctioncanthrowstd::exception,std::string,intorunhandledvoidfunction(){std::ve

c++ - 使用 GCC 和 C++11 实现类型 "long double"

我尝试搜索有关longdouble的信息,到目前为止,我了解到编译器对它的实现有所不同。在Ubuntu(XUbuntu)Linux12.10上使用GCC时,我得到了这个:doublePId=acos(-1);longdoublePIl=acos(-1);std::cout.precision(100);std::cout输出:PId8:3.141592653589793115997963468544185161590576171875PIl16:3.141592653589793115997963468544185161590576171875有人明白为什么他们输出(几乎)相同的东西吗

c++ - 等待 atomic_bool

我有两个线程和一个由第二个线程设置的标志。我可以使用atomic_bool,但我希望能够等待*在第一个线程上设置标志。我该怎么做?我猜我不能使用condition_variable,因为如果第二个线程在第一个线程开始等待之前调用notify_one,线程将不会唤醒。此外,检查标志是否已经设置应该相当快。我想这应该很简单,但我只是卡住了,所以我在这里问。提前致谢。*编辑:当然是阻塞,而不是忙等待。抱歉,如果不清楚。 最佳答案 在cbreak和Ravadre(注释)的帮助下,我从这里得到:intmain(){std::mutexm;st

c++ - 如何安全地将 `unsigned long int` 转换为 `int` ?

我有一个应用程序以unsignedlongint的形式创建唯一的id。该应用程序需要这种精度。但是,我必须在只允许int的协议(protocol)中发送这些id。协议(protocol)的接收应用程序不需要这种精度。所以我的问题是:如何将unsignedlongint转换为int,尤其是当unsignedlongint大于时>整数?编辑:协议(protocol)只支持int。我很想知道如何避免“翻车问题”发送消息的应用程序需要知道很长一段时间内的唯一性,而接收者只需要知道短时间内的唯一性。 最佳答案 这是一种可能的方法:#inclu