草庐IT

UINT_PTR

全部标签

c++ - Qt::make_shared 用于创建 QSharedPtr 和 std::make_shared 用于创建 std::shared_ptr

正如BjarneStroustrup的“C++之旅”中所述,作为一种已知的C++14实践,人们应该避免在代码中使用裸露的new和delete。标准库提供std::make_shared和std::make_unique用于创建智能指针以立即将分配的对象存储在其中。但是,不能将这些例程用于非标准智能指针,例如在Qt中。Qt有自己的内存管理模型(带父对象),但也提供智能指针类,如QSharedPointer和QPointer(尽管后者实际上不是拥有指针)。我的问题是:创建std::make_shared的Qt类似物不是很方便吗?像这样,创建QSharedPtr:namespaceQt{te

c++ - 为 std::shared_ptr 分配内存的正确方法

我已经实现了一个功能,在这个功能中,身份是交给我的,不受我的控制。它返回std::shared_ptr.在函数中,我分配了任意数量的内存,并通过shared_ptr返回对它的访问。我的内存分配是用newunsignedchar[123]完成的.问题是valgrind检测到新变体和删除变体的使用不匹配。当我使用new[](unsigned)为了分配内存,shared_ptr析构函数使用delete(void*)释放它,每当您使用“不正确”的分配器进行分配时,valgrind都会发出警告。更实际地说,我写了这个测试用例来说明我的意思:TEST(Example,Test1){unsigned

c++ - 在 C++11 中可移植地打印 std::uint64_t 变量的格式说明符

打印std::uint64_t类型值的格式说明符是什么?(来自)使用来自std::printf()的函数C++中的家庭?C99有PRIu64(来自)但我并不完全清楚PRIu64是有效的C++11,虽然我能找到它可能是的提示。没有PRIu64,据我所知,没有一种格式说明符适用于所有情况:在32位平台上,std::uint64_t将被定义为unsignedlonglong并且格式说明符将为%llu.在64位平台上,std::uint64_t将被定义为unsignedlong并且格式说明符将为%lu.但是对于VisualStudio,%llu在这两种情况下都有效。

c++ - Boost weak_ptr在多线程程序中实现资源池

我正在考虑使用boost::weak_ptr来实现一个对象池,这样当没有人使用其中一个对象时,它们就会被回收。不过,我担心的是,它是一个多线程环境,而且似乎在指向超出范围的对象的最后一个shared_ptr与从weak_ptr构造的新shared_ptr之间存在竞争条件。通常,您会使用锁或其他东西来保护此类操作;然而,这里的重点是您不知道shared_ptr何时可能超出范围。我对boost::shared_ptr和boost::weak_ptr有什么误解吗?如果没有,有人对做什么有什么好的建议吗?谢谢。安德鲁 最佳答案 要使用wea

c++ - 在 unique_ptr 上使用强制转换运算符是否危险?

我们有一个广泛的代码库,目前使用原始指针,我希望迁移到unique_ptr。但是,许多函数期望原始指针作为参数,并且在这些情况下不能使用unique_ptr。我意识到我可以使用get()方法来传递原始指针,但这会增加我必须接触的代码行数,而且我觉得它有点难看。我推出了自己的unique_ptr,如下所示:templateclassmy_unique_ptr:publicunique_ptr{public:operatorT*(){returnget();};};然后每次我向需要原始指针的函数parm提供my_unique_ptr时,它都会自动将其转换为原始指针。问题:这样做有什么内在的

c++ - 使用 std::unique_ptr<T>& 而不是 std::unique_ptr<T> 有什么优势吗?

使用std::unique_ptr&有什么好处吗?而不是std::unique_ptr?例如,在函数参数中? 最佳答案 有几种不同的情况您想将所有权转移给函数使用std::unique_ptr您想允许函数修改指针使用std::unique_ptr&您想允许函数修改指针对象使用T&,并在调用站点取消引用如果指针可能为空,则使用T*并调用unique_ptr::get在调用站点你想让函数观察指针对象使用constT&,并在调用站点取消引用如果指针可能为空,则使用constT*并调用unique_ptr::get在调用站点你想让函数拥有指

c++ - uint64_t t3 = MAXDWORD + 1 == 0?

我真的不明白下面的代码发生了什么。为什么t3为零?uint64_tt1=MAXDWORD;//t1contains4294967295-CORRECTuint64_tt2=t1+1;//t2contains4294967296-CORRECTuint64_tt3=MAXDWORD+1;//t3contains0(zero)-HUH?? 最佳答案 decltype(MAXDWORD)是比uint64_t更窄的类型。所以表达式MAXDWORD+1也不是uint64_t,unsigned环绕行为在赋值之前被观察到到t3。t1+1使用uin

c++ - 在 BST 中使用 unique_ptr 而不是 shared_ptr

我正在尝试使用unique_ptr实现BST。我得到了shared_ptr的工作程序。我该如何着手使用unique_ptr来强制执行BinarySearchTree的单一所有权语义?当我将shared_ptr替换为unique_ptr时,出现了我无法理解的编译错误。#include#includetemplateclassBinarySearchTree{structTreeNode;typedefstd::shared_ptrspTreeNode;structTreeNode{Tdata;spTreeNodeleft;spTreeNoderight;TreeNode(constT&v

c++ - 为什么 shared_ptr<> 必须分别为控制 block 和管理对象分配?

此链接问题询问是否make_shared函数和shared_ptr构造函数不同。Whathappenswhenusingmake_shared部分答案是make_shared通常会在一次分配中为指向对象和智能指针控制block分配内存。shared_ptr构造函数使用两个分配。cppreference声明构造函数“必须”这样做,但没有给出任何理由。这是为什么?出于某种原因这是不可能的吗?还是因为其他原因被标准禁止? 最佳答案 想想std::shared_ptr构造函数是如何工作的:std::shared_ptr(newFoo());

c++ - 将 std::unique_ptr 传递给辅助函数

这是正确的方法吗?voidhelperFunc(MyClass*ptr){//dosomethingwithptr,}unique_ptrp(newMyClass());helperFunc(p.get());或者我应该使用shared_ptr进行此类操作吗? 最佳答案 除非你想获得内存的所有权(在这种情况下你应该传递shared_ptr或unique_ptr),你为什么要使用指针?通过引用传递。voidhelperFunc(MyClass&obj){//dosomethingwithptr,}unique_ptrp(newMyCl