草庐IT

c++ - 为什么 std::shared_ptr 从基类和派生类调用析构函数,而 delete 仅从基类调用析构函数?

这个问题在这里已经有了答案:shared_ptrmagic:)(3个回答)关闭8年前。为什么当使用std::shared_ptr释放时,当第二个示例仅从基类调用析构函数时,会同时从基类和派生类调用析构函数?classBase{public:~Base(){std::coutsharedA(newDerived);}std::cout输出:--------------------DeriveddestructorBasedestructor--------------------Basedestructor我期望在这两种情况下都有相同的行为。 最佳答案

c++ - 来自 T* 的 std::unique_ptr<T> 的构造函数是显式的背后的原因是什么?

由于std::unique_ptr提供了一种方便的方法来避免内存泄漏并确保异常安全,因此传递它们而不是原始指针是明智的。因此,一个人可能想要(成员)具有类似签名的函数std::unique_ptrfoo(somedata);不幸的是,在实现这样的功能时,不能简单地实现std::unique_ptrfoo(somedata){return{newsome_type(data)};//error}但必须改为std::unique_ptrfoo(somedata){returnstd::move(std::unique_ptr(newsome_type(data)));//awkward}因

c++ - 为什么 unique_ptr operator-> 不是 const-overloaded?

std::unique_ptr::operator->有签名pointeroperator->()constnoexcept;所以operator->是const但返回一个可变指针。这允许如下代码:voidmyConstMemberFunction()const{myUniquePtrMember->nonConstFunction();}为什么标准允许这样做,以及防止上述使用的最佳方法是什么? 最佳答案 把它想象成一个普通的指针:int*consti;是const指向非const的指针int.您可以更改int,但不是指针。intc

C++:auto_ptr + 前向声明?

我有这样的课:classInner;classCont{public:Cont();virtual~Cont();private:Inner*m_inner;};在.cpp中,构造函数创建Inner的实例与new和析构函数delete它。这工作得很好。现在我想更改此代码以使用auto_ptr所以我写:classInner;classCont{public:Cont();virtual~Cont();private:std::auto_ptrm_inner;};现在,构造函数初始化了auto_ptr而析构函数什么也不做。但它不起作用。当我实例化这个类时,问题似乎出现了。我收到此警告:wa

c++ - VS2012 : 'nmake' is not recognized as an internal or external command

我尝试了VS2012NativeTools、CrossTools和Developers命令提示符。它不识别'nmake'。它在VS2010上也不起作用。在VS2008上,找不到windows.h之类的依赖我想为VS2012构建一个静态库curl:http://quantcorner.wordpress.com/2012/04/08/using-libcurl-with-visual-c-2010/ 最佳答案 对于VisualStudio2015社区版,将以下路径添加到您的系统环境路径C:\ProgramFiles(x86)\Micr

c++ - std::unique_ptr<T[]> 带有派生对象数组,使用已删除函数

在我的数值物理代码中,我需要使用unique_ptr创建一个派生对象数组,它们的类型是基类。通常,我会://HeaderfileoftheBaseclassclassParticle{public:Particle();//someconstructorvirtual~Particle();//virtualdestructorbecauseofpolymorphismvirtualfunction();//somerandomfunctionfordemonstration};//HeaderfileoftheDerivedclassclassElectron:publicParti

c++ - "local variables at the outermost scope of the function may not use the same name as any parameter"是什么意思?

我一直在阅读C++入门第5版。在第6.1章功能参数列表的第三段中。它写道“此外,函数最外层范围内的局部变量不得使用与任何参数相同的名称”。什么意思?我不是以英语为母语的人。我不明白函数的“最外层范围”的实际含义。 最佳答案 函数的最外层是定义函数体的block。您可以将其他(内部)block放入其中,并在该block的本地变量中声明变量。内部block中的变量可以与外部block中的变量或函数参数具有相同的名称;他们将名称隐藏在外部范围内。外部block中的变量不能与函数参数同名。演示:voidf(inta)//functionha

c++ - ptr->hello();/* VERSUS */(*ptr).hello();

我正在学习C++指针,而->运算符对我来说似乎很奇怪。代替ptr->hello();可以写成(*ptr).hello();因为它似乎也可以工作,所以我认为前者只是更方便方式。是这样还是有什么不同? 最佳答案 ->运算符只是语法糖,因为(*ptr).hello()是要键入的PITA。就在ASM级别生成的指令而言,没有区别。事实上,在某些语言中(想到D),编译器会根据类型计算出所有内容。如果你使用ptr.hello(),它就可以工作,因为编译器知道ptr是一个指针并且没有hello()属性,所以你的意思是(*ptr).hello().

c++ - 为什么提议的 `std::shared_ptr::operator[]` 以 `std::ptrdiff_t` 作为参数

AccordingtotheN4562proposal,thenewlyproposedstd::shared_ptr::operator[]takesinstd::ptrdiff_t,whichisasignedtype.这与标准库中的每个索引运算符都不一致。甚至std::unique_ptr::operator[]也需要std::size_t。做出这个决定的理由是什么? 最佳答案 大概这应该是指针接口(interface)的统一吧。用作数组时,好的ol'C指针接受负索引:p[-2]与*(p-2)相同;并且ptrdiff_t因此自

c++ - 是否预计 boost::thread_specific_ptr<>::get() 的使用会很慢?有什么解决办法吗?

我目前正在使用Valgrind的“Callgrind”分析一个存在性能问题的应用程序。在查看分析数据时,似乎有25%的处理时间花在boost::detail::get_tss_data的应用程序中,其主要目的是物理模拟和可视化。get_tss_data显然是由thread_specific_ptr::get调用的有人认为这是预期的吗?它通常是否暗示其他特定的东西?编辑:我的平台是:Linux-2.6.32、x86、GCC4.4.3、libc6-2.11.1/libpthread-2.11.1 最佳答案 thread_specific