草庐IT

malloc_ptr_t

全部标签

c++ - malloc 分配的内存在什么时候获得类型?

Thisquestion询问malloc分配的对象的动态类型是什么,根据最上面的答案:Thereturnvalueofmallocisablockofuninitializedstorage.Noobjecthasbeenconstructedwithinthatstorage.Andthereforeithasnodynamictype.这带来了另一个问题:在什么时候说malloc返回的存储获得类型是有意义的。例如:void*p=malloc(sizeof(int));int*pi=(int*)p;我们可以说上面的pi指向一个动态类型int的对象,尽管它是未初始化的吗?

c++ - 返回 null shared_ptr 是否正确?

例如,有一个查找对象的函数,如果找到对象则返回shared_ptr,并且必须以某种方式指示未找到对象。std::vectorStorage::objects;std::shared_ptrStorage::findObject(){if(objects.find){returnobjects[x];}else{returnnullptr;}}std::shared_ptrobj=Storage::findObject();if(obj){print("found");}else{print("notfound");}像上例那样返回用nullptr隐式初始化的shared_ptr是否正确

c++ - unique_ptr 什么时候需要一个完整的类型?

在下面的代码中函数f()可以调用operatorbool()和operator*()unique_ptr的成员函数对于不完整的classC.但是当函数g()尝试为unique_ptr>调用相同的成员函数,编译器突然想要一个完整的类型并尝试实例化X,然后失败。由于某种原因unique_ptr>::get()不会导致模板实例化并正确编译,如函数h()中所示.这是为什么?是什么造就了get()不同于operatorbool()和operator*()?#includeclassC;std::unique_ptrpC;C&f(){if(!pC)throw0;//OK,eventhoughCis

c++ - 为什么 operator* of rvalue unique_ptr 返回一个左值?

使用来自“死的”unique_ptr的operator*的返回值是不好的。以下代码可以编译,但当然会导致未定义行为:auto&ref=*std::make_unique(7);std::cout为什么标准没有将std::unique_ptr右值的operator*的返回类型设为内部值的右值,而不是左值,像这样://couldhavebeendoneinsideunique_ptrT&operator*()&{return*ptr;}T&&operator*()&&{returnstd::move(*ptr);}在这种情况下这会工作正常:std::cout(7)但是开头的代码无法编译(无

c++ - 调用删除器时 shared_ptr 是否仍然拥有它的对象?

我有一个带有自定义删除器的std::shared_ptr,在那个删除器中,我想获取原始std::shared_ptr的临时拷贝。用代码形式表示:structFoo:publicstd::enable_shared_from_this{};voiddeleter(Foo*f){{std::shared_ptrtmp=f->shared_from_this();//LineA}deletef;}intmain(){std::shared_ptrfoo(newFoo,&deleter);}我的问题是:在A行,关于shared_from_this()的调用有什么可以说的吗?合法吗?如果是这样,

c++ - 类构造函数上 boost::shared_ptr 的默认值

假设我有这样的类classA{public:A(inta,boost::shared_ptrptr){//whatever!}};我的问题是,该ptr的默认值是多少?我希望能够使用创建该类的实例AmyA(5);当然我知道我可以用一个参数创建另一个构造函数,但我正在寻找类似的东西A(inta,boost::shared_ptrptr=WAT?)这可能吗?目前我使用的是双构造函数方式,但这样做会很棒。 最佳答案 #includeA(inta,boost::shared_ptrptr=boost::make_shared())检查http

c++ - 同时重置和复制 shared_ptr 是否线程安全?

Boostdocumentation描述了从多个线程同时访问共享指针时的行为。他们特别举了一些例子:shared_ptrp(newint(42));//---Example1---//threadAshared_ptrp2(p);//readsp//threadBshared_ptrp3(p);//OK,multiplereadsaresafe//---Example2---//threadAp.reset(newint(1912));//writesp//threadBp2.reset();//OK,writesp2//---Example3---//threadAp=p3;//re

c++ - 为什么 std::shared_ptr 取消引用不抛出空指针异常(或类似异常)?

异常是C++的重要组成部分,使用它的原因之一(我知道还有很多更重要的其他原因)是为了避免使用大量if混淆代码的不必要的检查>陈述(也许这是一个不正确的假设?)。所以现在我很好奇为什么std::shared_ptr::operator*和std::shared_ptr::operator->不抛出null_ptr_exception或类似的? 最佳答案 我的理解是,智能指针类的设计看起来和行为都像原始指针。鉴于此指导设计原则,理想情况下,遗留代码可以使用等效所有权语义简单地将原始指针的使用替换为智能指针,并且代码将像以前一样工作。因此

【C语言】动态内存管理(malloc,free,calloc,realloc,柔性数组)

文章目录为什么存在动态内存管理动态内存函数的介绍mallocfreecallocrealloc常见的动态内存错误对NULL指针的解引用操作对动态开辟空间的越界访问对非动态开辟内存使用free释放使用free释放一块动态开辟内存的一部分对同一块动态内存多次释放动态开辟内存忘记释放(内存泄漏)几个经典的笔试题题目1题目2题目3题目4C/C++程序的内存开辟柔性数组柔性数组的特点柔性数组的使用柔性数组的优势本章重点为什么存在动态内存管理动态内存函数的介绍mallocfreecallocrealloc常见的动态内存错误几个经典的笔试题柔性数组为什么存在动态内存管理我们已经掌握的内存开辟方式有:intv

c++ - 为什么 weak_ptr 可以打破循环引用?

我学到了很多关于weak_ptr与share_ptr一起使用来打破循环引用的知识。它是如何工作的?如何使用它?任何人都可以给我一个例子吗?我完全迷失在这里。还有一个问题,什么是强指针? 最佳答案 强指针持有对象的强引用——意思是:只要指针存在,对象就不会被销毁。对象不“知道”每个指针,只知道它们的编号——这就是强引用计数。weak_ptr会“记住”对象,但不会阻止它被销毁。你不能通过弱指针直接访问对象,但你可以尝试从弱指针创建一个强指针。如果该对象不再存在,则生成的强指针为空:shared_ptrsp(newint);weak_pt