jjzjj

myObject

全部标签

c++ - 局部变量在超出范围时删除另一个变量的内存

这个问题在这里已经有了答案:WhatisTheRuleofThree?(8个答案)关闭9年前。在设计动态分配内存的类时,我遇到了以下有关内存分配的问题。我希望你们中的一些人能够为我指明正确的方向,让我知道我应该如何以更好的方式设计我的类(class)。我的类动态分配内存,因此也在其析构函数中将其删除。为了说明问题,请考虑以下愚蠢的类声明:classtestClass{int*data;public:testClass(){data=newint;*data=5;}~testClass(){deletedata;}};到目前为止一切顺利。现在假设我在main中创建了这些对象之一intma

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之后使用它们访问元素会产生未定义的行为。 关于

c++ - 访问边界外的数组元素是否会破坏它

是否有可能在其边界之外访问数组会破坏其现有元素MyObject*array[10];for(inti=0;i访问数组[15]会导致0-10之间的元素损坏吗? 最佳答案 couldaccessingarray[15]resultinthecorruptionoftheelementsbetween0-10?是的。这是未定义的行为,UB的本质是任何都可能发生。特别是,推断什么可能发生或什么更有可能发生通常没有多大意义。它可以是任何东西,包括一些在UB之前完好无损的数组元素的损坏。 关于c++

c++ - 我如何确定例程正在利用 (N)RVO?

我想确保我的例程尽可能利用(N)RVO。除了解析生成的反汇编之外,还有什么我可以做的或检查是否正在使用(N)RVO编译例程?在这一点上,我最感兴趣的是MSVC和GCC。 最佳答案 不,不是真的。但是,您可以在编写代码时遵循准则。未命名返回值优化每次返回临时对象时,这几乎都会触发,即使在Debug模式下也是如此。returnMyObject(....);命名返回值优化每次函数总是返回相同的局部变量时,这几乎都会被触发:MyObjectfunc(){MyObjectresult;if(...){returnresult;}result.

C++ 未初始化的类实例数组

我一直在搜索,但找不到这个问题的答案。有没有办法告诉new运算符不调用类构造函数?MyObject*array=newMyObject[1000];这将调用MyObject()一千次!我想自己填充分配的内存,不需要在构造函数中初始化的任何信息。使用malloc()并不是非常和谐的C++代码恕我直言。MyObject*array=(MyObject*)malloc(sizeof(MyObject)*1000); 最佳答案 相当于malloc的C++是分配函数operatornew.你可以像这样使用它:MyObject*array=st

c++ - 如何有效地将左值或右值绑定(bind)到同一个引用?

假设您有一个C++函数,它使用了(常量)参数的更改版本。MyObjectalter_obj(MyObjectconst&obj);//Createsnew,alteredobjectvoidfunc(MyObjectconst&original){MyObjectconst&altered(alter_obj(original));//...}由于“最重要的常量”导致临时对象的生命周期延长,因此可以正常工作。如果alter_obj()满足返回值优化的要求,它也相当有效,因为RVO意味着不会不必要地复制值返回的更改对象。如果您根本不进行更改,它也会很有效:voidfunc(MyObjec

c++ - 为什么 -fsanitize=undefined 导致 "undefined reference to typeinfo"?

以下测试用例,从真实世界的应用程序中缩减而来,无法与-fsanitize=undefined链接(使用GCC6.1.1),但没有它也能正常链接。谁能告诉我为什么?似乎与Qt/QObject、-fvisibility=hidden、-fsanitize=undefined的组合有关,但问题到底出在哪里超越我。lib1.h:#includeclassMyObject:publicQObject{public:MyObject(QObject*parent=nullptr);~MyObject();voidmyMethod();};lib1.cc:#include"lib1.h"#defin

c++ - 在 C++ 的特定情况下,是否在没有删除新运算符的情况下创建了对象

如果我们有如下代码片段:MyObjectmy_object=MyObject(0);my_object=MyObject(1);MyObject(0)发生了什么?删除了吗?看看我读到的关于它的内容,只有当我们离开创作范围时,它才应该被删除,所以答案可能是否定的。如果是这种情况,除了使用指针之外,还有什么方法可以显式删除它吗? 最佳答案 MyObjectmy_object=MyObject(0);此行使用MyObject的构造函数在堆栈上创建了my_object,该构造函数可以接受int。my_object=MyObject(1);这

c++ - 我们是否应该在大型 std::vector 中存储指向类实例的智能指针以获得更好的性能?

当在std::string中存储自定义类(不是“简单”类,例如不是std::complex,不是std::vector等)的大量实例时,我们应该选择一个简单的std::vector还是std::vector>是更好的选择?我写了一些基准代码(从thisblogpost扩展代码,关于C++11在C++03上move语义改进),似乎vector>为1,500,000项vector提供了更好的性能。事实上,在装有Windows764位、IntelCorei5四核CPU和8GBRAM的PC上,我得到了以下结果(test.exe1500):vector>:1.5秒vector>:1.6秒vect

c++ - 类实例和指针背后的 Delphi 设计原则是什么?

我有C++背景,对类、指针和内存地址相当了解。但是,对于Delphi,我发现自己很困惑。我知道,当您在函数/过程的var部分中声明特定类型类的变量时,您真正声明的是指向该类的指针。例如,下面的Delphi和C++大致相同,都在堆上分配MyObject类所需的内存量。//DelphiprocedureBlah.Something();varo:MyObject;begino:=MyObject.Create;o.Free;end;//C++voidBlah::Something(){MyObject*o=newMyObject();deleteo;}在C++中,使用指针(和引用)允许在类