草庐IT

c++ - std::unique_ptr 是 RAII 的应用吗?

这是对它的准确描述吗?有道理吗?您是否保证在unique_ptr超出范围之前它指向的对象不会被删除[即使您没有使用unique_ptr]? 最佳答案 是的,std::unique_ptr遵循RAII设计原则。不,std::unique_ptr不会阻止其他代码做一些愚蠢的事情,比如在属于unique_ptr的指针上调用delete>。unique_ptr本身将在其拥有的对象上调用deleter1,当出现以下任一情况时:超出范围或unique_ptr被重新分配(通过operator=或reset)以指向不同的对象还可以通过移动到不同的智

c++ - 为什么以不同的顺序使用 std::remove_reference 和 std::remove_const 会产生不同的结果?

在下面的代码中,我使用了std::remove_const和std::remove_reference但在两种情况下以不同的顺序给出了不同的结果:#include#include#include#include#includeusingnamespacestd;intmain(){vectorar={"mnciitbhu"};cout::type>::typeTT;cout::value::value::value::type>::typeTT;cout::value::value::value输出是:Firstcase:truefalsefalseSecondcase:falsetr

c++ - std::auto_ptr、delete[] 和泄漏

为什么这段代码不会导致内存泄漏?intiterCount=1000;intsizeBig=100000;for(inti=0;ibuffer(newchar[sizeBig]);}WinXPsp2,编译器:BCB.05.03 最佳答案 因为你(不)幸运。auto_ptr调用delete,而不是delete[]。这是未定义的行为。尝试做这样的事情,看看你是否幸运:structFoo{char*bar;Foo(void):bar(newchar[100]){}~Foo(void){delete[]bar;}}intiterCount=1

c++ - 如何在 std::set 中查找具有特定字段值的对象?

我调用了一个返回std::setconst&的方法其中T是一个类类型。我想要实现的是检查集合是否包含T类型的对象具有自动化测试中断言的特定字段值。应该对多个对象进行此检查。这是一个简单的例子:让类型T是Car举个例子set包含一堆汽车。现在我想在该集合中找到一辆具有特定颜色和特定门数和特定最高速度的汽车。如果找到那辆汽车,则第一个断言为真,应该找到具有其他字段值的下一辆车。我不允许更改T的实现.使用Boost就OK了。你会怎么做? 最佳答案 这取决于T的实现.让我们坚持你的类的例子Car.假设该类看起来像这样:classCar{pu

c++ - 为什么 .join 仍然是必要的,当所有其他线程都在主线程之前完成时?

学习C++多线程。在我的示例中,线程helper1和helper2已在main线程完成之前完成执行。但是,程序崩溃。我特别取出了.join()语句,以查看程序的行为,预计没有错误,因为main()调用std::terminate在另外两个线程完成后。voidfoo(){//simulateexpensiveoperationstd::this_thread::sleep_for(std::chrono::seconds(5));std::cout 最佳答案 我会说你的问题没有意义,因为它基于错误的假设。知道线程已完成的唯一方法是当线

c++ - std::move 是否使指针无效?

假设如下:templateclassPipeline{[...]voidconnect(OutputSidefirst,InputSidesecond){Queuequeue;first.setOutputQueue(&queue);second.setInputQueue(&queue);queues.push_back(std::move(queue));}[...]std::vector>queues;};move后指向队列的指针在“first”和“second”中是否仍然有效? 最佳答案 Doesstd::moveinval

c++ - std::vector::insert 是否按定义保留?

在std::vector上调用insert成员函数时,是否会在“推回”新项之前保留?我的意思是标准是否保证了这一点?换句话说,我应该这样做吗:std::vectora{1,2,3,4,5};std::vectorb{6,7,8,9,10};a.insert(a.end(),b.begin(),b.end());或者像这样:std::vectora{1,2,3,4,5};std::vectorb{6,7,8,9,10};a.reserve(a.size()+b.size());a.insert(a.end(),b.begin(),b.end());还是其他更好的方法?

c++ - 为什么我会收到编译错误 "use of deleted function ' std::unique_ptr ...”

我收到一个巨大的编译错误信息c:\mingw\include\c++\6.1.0\bits\predefined_ops.h:123:18:error:useofdeletedfunction'std::unique_ptr::unique_ptr(conststd::unique_ptr&)[with_Tp=Deduction;_Dp=std::default_delete]'{returnbool(_M_comp(*__it1,*__it2));}当我将自定义比较器传递给STLset_difference函数时。我的代码:structValue{std::stringded_cod

c++ - 返回类型 std::optional<std::variant<...>>

我遇到这样一种情况,函数必须返回从表中获取的值。此表中的单元格(假设该表正常工作...)可能包含值,也可能不包含值。该值也可以是以下几种类型之一:int,double,string,date(但没有其他类型)。这样的函数会返回什么?返回std::optional>是个好主意吗??这对optional有用吗?和variant? 最佳答案 我认为这是std::monostate的一个有用用途.具体来说,variant.monostate对于variant的情况很有用可能不包含值。使用实际类型而不是optional的好处是访问正常工作吗?

c++ - 在这种情况下使用 std::vector 的哪个构造函数

这看起来很简单,但我很困惑:我创建一个包含一百个vector的方法,比方说,ints是std::vector*pVect=newstd::vector(100);但是,查看std::vector的documentation我看到它的构造函数的形式是explicitvector(size_typen,constT&value=T(),constAllocator&=Allocator());那么,前一个是如何工作的?new是否使用从默认构造函数获得的初始化值调用构造函数?如果是这样的话,会吗std::vector*pVect=newstd::vector(100,my_allocator