草庐IT

new_list

全部标签

使用 new 关键字创建的 C++ 对象不呈现;在堆栈上创建的对象确实

编辑:我去掉了所有纹理和法线贴图,但问题仍然存在我正在尝试在屏幕上绘制一大块地形。渲染函数如下所示:voidTerrainChunk::Render(){std::cout在栈上创建对象时TerrainChunkchunk("chunk1.png","grass.png");chunk.Init();它呈现完美。当我用new创建它的时候TerrainChunk*chunk=newTerrainChunk("chunk1.png","grass.png");chunk->Init();什么都没有显示。在这两种情况下,都会调用Render并打印出正确的高度图。我希望这两种情况的行为相同。编

c++ - 删除 std::list 中的项目,同时保留分配的项目

我构建了一个std::list定期合并在一起的项目(图形组件结构)。这个想法是,如果我发现一个连接两个组件的节点,它们就会变成一个单独的组件,而我的列表会枚举我的组件。每个组件都有一个指向其“父”组件的句柄(在本例中为std::list::iterator),该句柄在合并后设置。通过这种方式来确定特定节点所属的组件,我沿着这条链向上走。最后我要找的是std::list上的操作这让我可以使用项目N的迭代器,并将其从列表中删除但不释放它:列表其余部分的结构的修改方式与正常删除它的方式完全相同。最好是比重新分配项目、从列表中复制它并调用真正的remove更简单的东西。或erase.也许我可以

c++ - 在 vector 图上使用 initializer_list

我一直在尝试初始化>的map使用新的0X标准,但我似乎无法获得正确的语法。我想制作一个带有key:value=1:的单个条目的map#include#include#includeusingnamespacestd;map>A={1,{3,4}};....它在使用gcc4.4.3时出现以下错误:error:nomatchingfunctionforcalltostd::map>,std::less,std::allocator>>>>::map()编辑按照Cogwheel的建议并添加额外的大括号,它现在编译时带有警告,可以使用-fno-deduce-init-list标志消除该警告。这

c++ - Placement-new 与 gcc 4.4.3 严格别名规则

我有一些代码,多年来我一直在成功使用这些代码来实现“变体类型对象”;也就是说,一个C++对象可以保存各种类型的值,但只使用(大约)尽可能多的内存作为最大的可能类型。该代码在本质上类似于标记union,只是它也支持非POD数据类型。它通过使用char缓冲区、放置新/删除和reinterpret_cast来实现这一魔力。我最近尝试在gcc4.4.3(使用-O3和-Wall)下编译这段代码,并收到很多这样的警告:warning:dereferencingtype-punnedpointerwillbreakstrict-aliasingrules根据我的阅读,这表明gcc的新优化器可能会生成

C++11 initializer_list 构造函数标记为 "explicit"

我能否将explicit与init-list构造函数一起使用,以确保像{a}这样的表达式不会导致意外的隐式转换?还有一个想法:应该我担心吗?编写{a}比简单地编写a不太可能出错,但另一方面,从代码中我们可能仍然不清楚我们正在构建一个通过隐式转换对象。classFoo{explicitFoo(std::initializer_listilist){/*...*/}}; 最佳答案 你不能。它确实导致意外的隐式转换。但是,意外的隐式转换是不允许的,编译器将拒绝您的程序。然而,这不会阻止编译器选择或考虑它。示例voidf(Foo);void

c++ - 在派生类中重写运算符 new/delete

我有一个无状态的抽象基类,各种具体类都从中继承。其中一些派生类也是无状态的。因为它们中的许多是在运行期间创建的,所以我想通过覆盖运算符new()/delete()让所有无状态派生类模拟单例来节省内存和开销。一个简化的例子看起来像这样:#includestructBase{virtual~Base(){}protected:Base(){}//preventconcreteBaseobjects};structD1:publicBase{//statefulobject--defaultbehaviorintdummy;};structD2:publicBase{//statelesso

c++ - 使用 boost::assign::list_of 构造 std::vector 时的歧义

这段代码:std::vector(boost::assign::list_of(1)(2)(3));给出错误:main.cpp:Inmemberfunction'void::RequestHandler::processRequest(Foo&,Bar,unsignedint,unsignedint*,constchar*,boost::shared_ptr&)':main.cpp:450:error:callofoverloaded'vector(boost::assign_detail::generic_list&)'isambiguous/4.4.2/bits/stl_vecto

c++ - initializer_list 返回的生命周期延长

所以我有一个返回类型为auto的lambda我在支持initializer_list的阵列方面遇到问题在这里被摧毁:constautofoo=[](constauto&a,constauto&b,constauto&c){return{a,b,c};};我将像这样使用lambda:autobar=foo(1,2,3);for(constauto&i:bar)cout我正在从事的一项工作将所有lambda表达式作为单一语句作为其编码标准的一部分(请随意表达您的愤怒。)我认为我可以通过以下方式解决这个问题:给予foovectorint的返回类型,但这搞砸了它的通用性:constautofo

c++ - 为什么遍历比合并两个排序的 std::list 更耗时?

令我惊讶的是,遍历比合并两个已排序的std::list花费的时间多12%。由于合并可以被认为和实现为连续的元素比较、列表拼接和迭代器遍历两个分离的排序链表。因此,遍历不应比合并它们慢,尤其是当两个列表足够大时,因为迭代元素的比例正在增加。但是,结果好像和我想的不符,我是这样验证上面的想法的:std::listlist1,list2;for(intcnt=0;cntdiff=std::chrono::system_clock::now()-start;std::cout附言。icc足够聪明,可以消除选项2。尝试sum+=num;并打印出sum。这是perf的输出:(测量的时间在不使用pe

c++ - Constexpr 替代 placement new 能够使内存中的对象保持未初始化状态?

我正在尝试创建一个静态容器,它具有基于堆栈的内存并且可以容纳T的N个实例。非常类似于std::vector我希望当前未使用的内存不包含T的初始化项。这通常可以通过placementnew来解决,但不可能在constexpr中使用。使用union我发现了一个技巧,您可以为此使用union,如下所示:templateunioncontainer_storage_type{structempty{};constexprcontainer_storage_type():uninitialized{}{}constexprcontainer_storage_type(value_typev):v