jjzjj

soft-delete

全部标签

c++ - 为什么这个无锁堆栈类中的 'deleting' 节点会导致竞争条件?

在AnthonyWilliams的《C++ConcurrencyinAction》一书中,第7.2.1节列出了一个无锁堆栈实现:templateclasslock_free_stack{structnode{shared_ptrdata_;node*next_;node(constT&data):data_(make_shared(data)){}};atomichead_;public:voidpush(constT&data){node*new_node=newnode(data);new_node->next_=head_.load();while(!head.compare_e

c++ - 循环依赖 : can't delete an incomplete type

我不明白为什么会出现此编译器错误:errorC2027:useofundefinedtype'GameState'note:seedeclarationof'GameState'errorC2338:can'tdeleteanincompletetypewarningC4150:deletionofpointertoincompletetype'GameState';nodestructorcalled这是相关代码:#pragmaonce#include#include"SpawnManager.h"#include"Resource.h"#include#includeclassGa

c++ - 是否需要将 delete 用于在 vector 中创建的新数组?

我正在尝试为void**数据数组创建一些动态数组。std::vectordata;data.push_back(newdouble[1024]);//arrayofdoublesdata.push_back(newshort[1024]);//arrayofshorts为了清理我应该只使用data.clear();或者是否需要删除每个新的(s),如果需要,如何完成? 最佳答案 ForcleanupshouldIjustusedata.clear();这将从vector中删除所有指针。如果其中任何一个是指向它们各自动态对象的唯一拷贝,

c++ - 如果我有运算符 T *(),是否需要重载 delete?

如果我有一个包含指针的模板类A,并且A有一个将返回该指针的隐式转换运算符,我是否需要,或者我应该,为A定义一个delete运算符,如果我打算将delete应用于此类的对象? 最佳答案 如果定义operatornew,则只需定义operatordelete——在这种情况下,您几乎必须这样做。这并不意味着某些东西不需要删除您的A*——但您不需要为此定义任何运算符,它会默认工作。 关于c++-如果我有运算符T*(),是否需要重载delete?,我们在StackOverflow上找到一个类似的问

c++ - 传递 std::ofstream 作为参数时,为什么我要生成 "use of deleted"函数?

这个问题在这里已经有了答案:Whycopyingstringstreamisnotallowed?(3个答案)C++copyastreamobject(5个答案)关闭7年前。我有一个成员是std::ofstreamfBinaryFile和一个voidsetFile(std::ofstream&pBinaryFile){fBinaryFile=pBinaryFile;}输出:Data.h:86:16:error:useofdeletedfunction‘std::basic_ofstream&std::basic_ofstream::operator=(conststd::basic_o

c++ - 在 C++ 中重载 new、delete

我遇到这一行是stroustrup运算符函数必须是成员或至少采用一个用户定义类型的参数(重新定义new和delete运算符的函数不需要)。operatornew和operatordelete不是将用户定义的类型作为它们的参数之一吗?这是什么意思,我在这里遗漏了什么吗 最佳答案 Stroustrup的引述显然适用于运算符重载。C++语言仅支持用户定义类型的运算符重载。这意味着重载函数(operator)必须是用户定义类型的成员,或者是具有至少一个用户定义类型参数的独立函数。这正是相关引述的意思。但独立(非成员(member))oper

c++ - 我应该在我的 C++ WIn32 应用程序中重写 operators new/delete

我知道Microsoft自己曾经建议通过调用HeapCreate()和HeapAlloc()来覆盖operatornew,但那是不久前的事了。有关详细信息,请参阅KB139638。在Win32上重写new/delete是否仍然有益?推荐的实现方式是什么?TIA。 最佳答案 这篇文章说你可以做,而不是说你应该。其中的代码写得很糟糕,一点也不有趣,而且它不是线程安全的。通常,提供的new和delete实现可以很好地满足所有一般编程需求。只有当您确定了重新实现可以解决的特定问题时,您才应该考虑重新实现它们。

c++ - C++ delete 语句的动态是什么?

这只是出于好奇,因为除了最基本的用途外,我没有在c++中使用过new和delete。我知道delete会释放内存。我想知道的是它如何处理更复杂的情况?例如,如果我有这样一个用户定义的类:classMyClass{public:MyClass();~MyClass(){delete[]intArray;}//publicmembershereprivate:int*intArray;};假设该类以某种方式为intArray分配内存,然后在析构函数中释放它,如果我这样使用该类会怎样:MyClass*myClass=newMyClass();并稍后使用deletemyclass;发布它del

c++ - 在 valgrind 中将 QSharedPointer 与 new[] 一起使用会产生 "Mismatched free()/delete/delete[]"

我有以下代码:QPair,int>someclass::somefunction(){intsiz=data_size();QSharedPointerbuffer(newunsignedint[siz]);//Fillthebuffer...returnqMakePair(buffer,siz);}在某些时候,此函数返回的QSharedPointer将超出范围,构造函数中设置的指针将被释放。使用valgrind3.6.1,出现“不匹配的free()/delete/delete[]”错误。我对QSharedPointer的使用有什么问题吗?还是我只能忍受这个valgrind警告?

c++ - myVector.erase(myObject) 是否在 myObject 上调用 delete?

类似于thisquestion但使用对象而不是指针。如果我有如下代码Foof;vectorvect;vect.push_back(f);vect.erase(vect.begin());我的对象去了哪里?是否调用了删除?如果其他人持有指向它的指针怎么办?这是内存泄漏吗? 最佳答案 push_back在vector中存储f的拷贝,然后erase销毁它。f本身不受此影响。当您删除时,vector中元素的所有指针、引用和迭代器都将失效。在erase之后使用它们访问元素会产生未定义的行为。 关于