我通常从未在C++中看到新测试,我想知道为什么.
Foo *f = new Foo;
// f is assumed as allocated, why usually, nobody test the return of new?
我在我的程序中制作了一个小内存泄漏查找程序,但我的方法是重载new和delete(以及new []和delete [])似乎没有做任何事情.
void* operator new (unsigned int size, const char* filename, int line)
{
    void* ptr = new void[size];
    memleakfinder.AddTrack(ptr,size,filename,line);
    return ptr;
}
Run Code Online (Sandbox Code Playgroud)
我重载的方式new显示在上面的代码片段中.我想这是操作员返回void*的东西,但我不知道该怎么办.
根据C++ Primer第4版,第755页,有一条说明:
现代C++程序通常应该使用allocator类来分配内存.它更安全,更灵活.
我不太明白这个说法.到目前为止,我读过的所有材料都教导用newC++分配内存.本书中展示了向量类如何利用分配器的示例.但是,我想不出其他情况.
任何人都可以帮忙澄清这个陈述吗?并举个更多例子?我应该何时使用分配器以及何时使用new?谢谢!
为什么不能以这种方式获得缓冲区的长度.
AType * pArr = new AType[nVariable];
Run Code Online (Sandbox Code Playgroud)
取消分配相同的数组时
delete [] pArr;
Run Code Online (Sandbox Code Playgroud)
运行时必须知道释放多少.在删除数组之前是否有任何方法可以访问该长度.如果不是,为什么没有提供这样的API来获取长度?
我理解在C++ 中使用new反对的好处malloc.但是,对于特定的情况下,如原始数据类型(非阵列) - int,float等等,是它更快地使用malloc比new?
虽然,new如果我们分配一个数组以便我们可以使用,它总是建议甚至用于原语delete[].
但对于非数组分配,我认为不会有任何构造函数调用int?因为,new运算符分配内存,检查它是否已分配,然后调用构造函数.但只为元非阵列堆分配,是它更好地使用malloc比new?
请指教.
我的一些代码仍然使用malloc而不是new.原因是因为我害怕使用,new因为它抛出异常,而不是返回NULL,我可以很容易地检查.结束语每次调用new的try{}catch(){}也看起来并不好.而在使用时malloc我可以做到if (!new_mem) { /* handle error */ }.
所以我有一个问题.我可以同时使用智能指针malloc吗?
就像是:
SmartPointer<Type> smarty = malloc(sizeof(Type));
Run Code Online (Sandbox Code Playgroud)
像这样的东西.
这可能吗?
谢谢,Boda Cydo.
我有这个代码..
 CEngineLayer::CEngineLayer(void)
 {
    // Incoming creation of layers. Wrapping all of this in a try/catch block is
    // not helpful if logging of errors will happen.
    logger = new (std::nothrow) CLogger(this);
    if(logger == 0)
    {
     std::bad_alloc exception;
     throw exception;
    }
    videoLayer = new (std::nothrow) CVideoLayer(this);
    if(videoLayer == 0)
    {
     logger->log("Unable to create the video layer!");
     std::bad_alloc exception;
     throw exception;
    }
 }
 IEngineLayer* createEngineLayer(void)
 {
    // Using std::nothrow would be a bad idea here as catching things thrown
    // from the …Run Code Online (Sandbox Code Playgroud) C++有几个功能来获取动态存储,其中大部分功能在某些基本方面有所不同.OS通常会添加几个.
由于它们的便携性和相似性,其中两个特别感兴趣:malloc和::operator new.
全局void* operator new(size_t, ::std::nothrow&)和void* malloc(size_t)?之间是否有任何差异(标准和实施)?
由于我所说的似乎有些混乱,请考虑以下两个调用:
void* p = ::std::malloc(10);
void* q = ::operator new(10, ::std::nothrow);
Run Code Online (Sandbox Code Playgroud)
明显和微不足道的区别在于如何释放内存:
::std::free(p);
::operator delete(q);
Run Code Online (Sandbox Code Playgroud)
注意:这个问题不重复,例如new/delete和malloc/free有什么区别?因为它谈到使用实际上不执行任何ctor调用的全局 operator new.
众所周知,C++标准定义了两种形式的全局分配函数:
void* operator new(size_t);
void* operator new[](size_t);
Run Code Online (Sandbox Code Playgroud)
而且,C++标准草案(18.6.1.2 n3797)说:
227)运算符new或operator delete不直接负责注意数组的重复次数或元素大小.这些操作在数组new和delete表达式的其他位置执行.但是,数组新表达式可以将operator参数增加到operator new以获得存储补充信息的空间.
让我困惑的是:
如果我们void* operator new[](size_t);从标准中删除,而只是使用该void* operator new(size_t)怎么办?定义冗余全局分配函数的基本原理是什么?
如果我有课 Rectangle
class Rectangle{
private:
    double width;
    double height;
public:
void    Set(double w , double l){
    width   = w;
    height  = l;
}
};
Run Code Online (Sandbox Code Playgroud)
我发现了一个这样的对象:
Rectangle *Obj;
Run Code Online (Sandbox Code Playgroud)
然后尝试初始化其属性:
Obj->Set(3,5);
Run Code Online (Sandbox Code Playgroud)
编译器在运行时显示: The variable 'Obj' is being used without being initialized.
问题可以通过以下方式解决:
Rectangle *Obj=new Rectangle;
Run Code Online (Sandbox Code Playgroud)
我会问一下原因!为什么编译器在编译时没有显示任何错误?