草庐IT

new_elem

全部标签

c++ - 使用 new 运算符在不知道对象类型的情况下将对象复制到堆

我有疑问,下面的函数可以接收类型A或派生类型的对象。A*copyToHeap(A&obj){A*ptr=newA(obj);returnptr;}如果我们这样调用它://BinheritsfromABbObj;B*hPtr=copyToHeap(bObj);hPtr指向的对象到底是A型还是B型?这样做安全吗? 最佳答案 当您在代码中执行以下操作时:A*ptr=newA(obj);您将始终获得一个A实例。obj将被视为A,并且将根据obj的“A部分”创建新的A。更好的方法是如先前的回复所示,将虚拟MakeCopy方法添加到基类并为派生

c++ - "new"运算符和 "new"函数之间的区别

这个问题在这里已经有了答案:Differencebetween'newoperator'and'operatornew'?(8个答案)关闭8年前。面试题:"new"运算符和"new"函数有什么区别?我回答没有区别,他们运行相同的代码,但面试官一直在挑刺我,好像那是错误的答案。这是错误的答案吗?还是面试官在耍我?如果答案是错误的,那么正确答案是什么?我继续说,如果您需要自定义分配,可以重载"new"运算符,但后来他想知道如何重载它。当然我没有那个答案,从来没有需要,但我告诉他我可以在10分钟内查到(这在面试中永远不是正确的答案)。所以无论如何,在对"new"运算符与"new"函数进行了一

c++ - 为什么允许 new 运算符将 *void 返回给每个指针类型?

在C++中,不允许在没有显式转换的情况下将void*指针分配给任何整型指针。这需要使用static_cast。但是这是怎么回事:int*iptr=newint;我知道new运算符定义如下:void*operatornew(size_t);C++如何处理这个问题?我知道这是一个基本问题,但很重要。我也知道低级代码必须使用void。但是这个赋值怎么可能合法呢?iptr是一个指向int的指针,new返回一个指向void的指针,这应该会触发一条消息,如“错误:从‘void*’到‘int*’的无效转换[-fpermissive]”。 最佳答案

c++ - 在 C++ 中通过 "new"重新分配内存

关于C++内存管理的小问题如果我做如下操作:pointer=newchar[strlen(someinput_input)+1];然后再次执行,strlen(someinput_input)可能会返回不同的结果。这是否会导致从先前的“new”语句分配的内存被保留?例如,每个new语句是从操作系统接收另一blockHEAP内存,还是只是重新分配?假设我做了一个最终的deletepointer[];,这会释放我通过new分配给那个指针的所有内存吗? 最佳答案 每次调用new必须与对delete的相应调用相匹配.顺便说一句,您可能应该考虑

c++ - c++中new的返回类型是什么?

在C中,malloc()返回void*。但是在C++中,new返回什么?doubled=newint; 最佳答案 您必须区分两件事。一个是新表达式。它是表达式newT,其结果是T*。它做了两件事:首先,它调用new运算符来分配内存,然后它调用T的构造函数。(如果构造函数中止除了异常(exception),它还会调用删除运算符。)不过,前面提到的新运算符有多种形式。最突出的是这个:void*operatornew(std::size_t);您可以明确地调用它,但很少有人这样做。还有其他形式的new运算符,例如数组void*operat

C++ new 和 delete 重载

new和delete运算符重载在使用不同的编译器和不同的c++标准进行编译时可能会或可能不会工作。这是正常行为吗?我使用以下代码来测试编译器。#includevoid*operatornew(size_tsize){std::cout以下是我测试代码时从几个编译器得到的结果。mingw-w64官方构建-x86_64-7.1.0-release-posix-seh-rt_v5-rev0.7zc++1112c++141clangx86_64-v4.0.0使用上面的编译器手动构建,没有补丁c++11andc++1412msvc-平台工具集v141和sdkv10.0.15063.0/std:c

c++ - "#define new DEBUG_NEW"和 "#undef THIS_FILE"等真的有必要吗?

当您创建新的MFC应用程序时,向导会在几乎每个CPP文件中创建以下代码块:#ifdef_DEBUG#definenewDEBUG_NEW#endif有时它还会添加:#undefTHIS_FILEstaticcharTHIS_FILE[]=__FILE__;如果这段代码是多余的,我想从我的CPP文件中删除它。我在VS2008上使用带有C++/CLI的MFC应用程序。从CPP中删除这段代码后,我尝试在Debug中运行,它似乎工作正常。"new"变量工作正常,没有泄漏,ASSERT对话框显示正确的文件名并跳转到有问题的行。谁能告诉我它的作用以及删除它是否安全? 最

c++ - new/delete 和::new/::delete 有什么区别?

newdelete或::new::delete我想知道::的用途,因为如果我删除它们,它似乎可以正常工作。以上就是autopointer教程中写的全部代码。#includesize_t*alloc_counter(){return::newsize_t;}voiddealloc_counter(size_t*ptr){::deleteptr;} 最佳答案 您可以为类覆盖new,但::new将始终在全局范围内查找。即:classA{void*operatornew(std::size_tsz){/*1*/}};void*operato

c++ - 如果我不使用 new 关键字,我会发生内存泄漏吗?

我是这门语言的新手,我对内存泄漏有一个基本的怀疑。不使用new关键字会不会泄露?(即在堆栈中使用我的变量并使用像std::vector这样的数据容器)我应该担心这个问题吗?如果是这样的话,有人能给我一个没有动态分配内存而造成泄漏的情况的例子吗? 最佳答案 i.ehavingmyvariablesinthestackandusingdatacontainerslikestd::vector不,使用std::vector或其他标准容器您不必担心。cansomeonegivemeanexampleofasituationthatcreat

c++ - 无法访问类 'std::basic_ios<_Elem,_Traits>' 中声明的私有(private)成员

这个特定方法有问题,不知道如何解决!我得到的错误是上面的:"errorC2248:'std::basic_ios::basic_ios':cannotaccessprivatememberdeclaredinclass'std::basic_ios'C:\ProgramFiles\MicrosoftVisualStudio10.0\VC\include\ostream604"我的方法是:ostreamoperator在标题中:friendstd::ostreamoperator关于如何解决这个问题的任何想法?我认为这与通过引用而不是值传递有关...但我有点困惑!