草庐IT

c++ - 解决由全局静态变量引起的内存问题

警告:出现这个问题是因为我必须处理一大堆糟糕的代码,没有适当的文档,这些代码是6年前由其他人作为研究项目编写的。显然,更好的解决方案是不通过适当的设计首先引起这些问题...也就是说,问题是:摆脱这种情况的最佳方法是什么:一个类在堆上分配内存,并在析构函数中释放它。在某处,类的实例在全局范围内声明。存在一个初始化此实例的函数。该函数的返回值用于初始化静态变量。全局范围变量在静态范围之外使用。最小工作示例:文件“myclass.h”:#ifndefMYCLASS_H#defineMYCLASS_H#includeusingnamespacestd;classmyclass{vector*o

c++ - 转换 int -> unsigned long long 是否由标准定义

我无法在标准中找到关于如何将int值转换为unsignedlonglong的确切规范。指定了各种类似的转换,如int->unsigned、unsigned->int(UBifnegative)、unsignedlonglong->int等例如GCC,-1被转换为0xffffffffffffffff,而不是0x00000000ffffffff。我可以依赖这种行为吗? 最佳答案 是的,这个定义很明确,它基本上是将maxunsignedlonglong+1添加到-1,它始终是maxunsignedlonglong。这包含在draftC++

c++ - 为什么 std::max 由 const 返回?

我想找到最大值Foo并对其调用inc(),这是一个非常量方法。当然,在寻找最大值时,我不想创建任何拷贝或移动,即我不想要Foofoo=std::max(foo1,foo2)。我尝试编写自己的max,但g++坚持要我返回一个const&。#includeclassFoo{public:Foo(intx):x_(x){std::cout(constFoo&foo)const{returnx_>foo.x_;}voidinc(){++x_;}intx_;};/**Doesn'tcompile.MustreturnconstT&ormustacceptnon-constT&*templatei

c++ - 如何解决由内联命名空间中的标识符冲突引起的不明确引用

考虑以下代码:#includeinlinenamespaceN1{intx=2;}intx=1;intmain(){std::cout这显然让我在std::cout上出错referencetoxisambiguous.::x也不起作用。我明白为什么会这样,但是如何在不重命名或删除变量或namespace的情况下解决这个问题?或者这是唯一的解决方案? 最佳答案 内联命名空间作用域变量具有静态storageduration(内部链接)。所以声明externintx;在显示x之前会为您完成LiveonColiru.这样,在名称查找期间将不

c++ - 只能由函数本身写入的函数参数 - 递归计数器

所以我正在尝试编写一个递归函数来跟踪它被调用的频率。由于它的递归性质,我将无法在其中定义迭代器(或者也许可以通过指针来定义它?),因为每当函数被调用时它都会被重新定义。所以我想我可以使用函数本身的参数:intcountRecursive(intcancelCondition,intcounter=0){if(cancelCondition>0){returncountRecursive(--cancelCondition,++counter);}else{returncounter;}}现在我面临的问题是,函数的调用者可以写入counter,我想避免这种情况。话又说回来,将counte

c++ - 如何记录特定内存位置何时被写入以及由哪个函数写入?

我有一个很少发生但会导致我的C++程序崩溃的错误。看来我有缓冲区溢出问题或类似问题。我发现这些类型的错误最难诊断。我的程序总是因为同一个损坏的内存位置而崩溃。是否有一些调试工具可以检测何时写入特定内存位置并记录执行此操作的函数?我正在使用VisualLeakDetector(VLD)查找内存泄漏,效果很好。它替换它自己的原始mallocs并记录每个分配。我想知道内存是否有类似的东西?我知道这样的事情会削弱程序,但它可能真的很有帮助。我正在使用VisualStudio2008。 最佳答案 如果您使用的是VisualC++,请查找dat

c++ - 什么时候删除由 (char *) 作为函数参数指向的内存?

代码1:voidfoo(char*text){}foo("Test");据我所知,这将会发生:内存分配给“测试”指针被创建并将其值复制到(char*textpointer),因此(char*text)指向内存中的位置,其中“Test”是(最好说,在第一个字符上"测试")函数执行完后,销毁了指向“Test”开头的指针(char*text),这不是内存泄漏吗?问题是,“Test”什么时候被删除,什么时候函数只销毁指针做某事不是更好吗?像那样?:char*_text="Test";foo(_text);delete[]_text; 最佳答案

c++ - 当观察者的生命周期比可观察者长时,何时以及由谁分离观察者

我在使用公司不同小组提供的第三方库(用C++编写)时遇到了这个问题。在Observer的析构函数中,它将自己从它订阅的所有可观察对象中分离出来,这部分对我来说很有意义。但是在Observable的析构函数中,它会检查observable是否有任何仍在其订阅者列表中的观察者。如果是,则抛出错误。我将把它故意在析构函数中抛出错误这一事实放在一边。有人可以尝试向我解释为什么可观察对象不应该期望观察者比它自己长寿,或者这只是一个糟糕的设计。如果这是一个糟糕的设计,当我们处于观察者比可观察者生命周期更长的情况时,有没有好的方法来处理它? 最佳答案

c++ - vector<bool> 可以由 int 初始化吗

我想枚举[0,31]的bool表示并将其存储在tries中供以后使用。staticconstintN=5;vectortries(N);for(inti=0;iinitializedbyint?//soIdon'thavetodobitoperationfor(intt=0;t 最佳答案 std::vector不能这样做,但是std::bitset能够。由于vector的大小在您的情况下是恒定的,因此您应该使用std::bitset.只需使用您想要的非负整数值对其进行初始化即可。请注意bitset不提供(或模仿)Container接

c++ - 按值返回由互斥量保护的 shared_ptr 是否安全?

这是一个代码示例:classA{boost::mutexa_mutex;boost::shared_ptra;boost::shared_ptrclone_a(void){boost::lock_guardlock(a_mutex);returna;}};建议boost::shared_ptr对A::a的复制构造函数调用将在boost::lock_guard析构函数调用之前尽管有编译器优化。那么,调用A::clone_a()安全吗? 最佳答案 如果您所说的“安全”是指您不会在a上发生数据竞争,那么是的。正如你所说。但是,正如您可能知