标签: new-operator

测试C++中"new"的返回是否有用?

我通常从未在C++中看到新测试,我想知道为什么.

Foo *f = new Foo;

// f is assumed as allocated, why usually, nobody test the return of new?

c++ new-operator

24
推荐指数
3
解决办法
3164
查看次数

重载新/删除

我在我的程序中制作了一个小内存泄漏查找程序,但我的方法是重载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++ operator-overloading new-operator delete-operator

24
推荐指数
4
解决办法
7万
查看次数

C++ STL分配器vs运算符new

根据C++ Primer第4版,第755页,有一条说明:

现代C++程序通常应该使用allocator类来分配内存.它更安全,更灵活.

我不太明白这个说法.到目前为止,我读过的所有材料都教导用newC++分配内存.本书中展示了向量类如何利用分配器的示例.但是,我想不出其他情况.

任何人都可以帮忙澄清这个陈述吗?并举个更多例子?我应该何时使用分配器以及何时使用new?谢谢!

c++ memory stl new-operator allocator

24
推荐指数
1
解决办法
1万
查看次数

查找动态分配的数组的大小

为什么不能以这种方式获得缓冲区的长度.

AType * pArr = new AType[nVariable];
Run Code Online (Sandbox Code Playgroud)

取消分配相同的数组时

delete [] pArr;
Run Code Online (Sandbox Code Playgroud)

运行时必须知道释放多少.在删除数组之前是否有任何方法可以访问该长度.如果不是,为什么没有提供这样的API来获取长度?

c++ size new-operator dynamic-allocation

24
推荐指数
2
解决办法
1万
查看次数

Malloc与Primitives的新作品

我理解在C++ 中使用new反对的好处malloc.但是,对于特定的情况下,如原始数据类型(非阵列) - int,float等等,是它更快地使用mallocnew

虽然,new如果我们分配一个数组以便我们可以使用,它总是建议甚至用于原语delete[].

但对于非数组分配,我认为不会有任何构造函数调用int?因为,new运算符分配内存,检查它是否已分配,然后调用构造函数.但只为元非阵列堆分配,是它更好地使用mallocnew

请指教.

c++ arrays malloc memory-management new-operator

24
推荐指数
4
解决办法
4382
查看次数

是否可以将C++智能指针与C的malloc一起使用?

我的一些代码仍然使用malloc而不是new.原因是因为我害怕使用,new因为它抛出异常,而不是返回NULL,我可以很容易地检查.结束语每次调用newtry{}catch(){}也看起来并不好.而在使用时malloc我可以做到if (!new_mem) { /* handle error */ }.

所以我有一个问题.我可以同时使用智能指针malloc吗?

就像是:

SmartPointer<Type> smarty = malloc(sizeof(Type));
Run Code Online (Sandbox Code Playgroud)

像这样的东西.

这可能吗?

谢谢,Boda Cydo.

c++ malloc smart-pointers new-operator

23
推荐指数
2
解决办法
1万
查看次数

可以手动抛出std :: bad_alloc吗?

我有这个代码..

 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++ throw new-operator bad-alloc

23
推荐指数
3
解决办法
2万
查看次数

全局operator new和malloc之间的区别

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++ malloc memory-management new-operator c++11

23
推荐指数
2
解决办法
1851
查看次数

当:: operator new足够时,为什么需要:: 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)怎么办?定义冗余全局分配函数的基本原理是什么?

c++ standards memory-management overloading new-operator

23
推荐指数
3
解决办法
1784
查看次数

使用和不使用new运算符初始化对象

如果我有课 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)

我会问一下原因!为什么编译器在编译时没有显示任何错误?

c++ memory-management new-operator

22
推荐指数
3
解决办法
7万
查看次数