草庐IT

new_elem

全部标签

c++ - 在 C++ 中,如何在不使用 new 且不单独声明单个元素的情况下创建 `std::initializer_list<base *>`?

在C++中,您可以在文件范围内声明一个数组:staticfooa[]={foo(),foo(),foo()};各个foo对象具有静态存储(即它们不在运行时分配)。如果我有一个由两个或更多派生类继承的基类,则以下内容可以编译但由于切片而无法按预期工作:staticbasea[]={derived1(),derived2()};这样的事情不应该导致切片发生:staticderived1d1;staticderived2d2;staticbase*a[]={&d1,&d2};我的问题是:如何在不声明d1的情况下做同样的事情?和d2与a分开,同时为单个(指向的)元素保留静态存储?以下给出了“获

c++ - 为什么 new 能够创建一个字符串数组?

我见过以下列方式使用字符串数组的代码。string*pointer=newstring[runtimeAmmount];我还看到过如下访问字符串中的单个字符。stringaString="this";charbString[]="that";bString[3]=aString[3];以上将导致bString等于“thas”。这表明字符串实际上是指向第一个字符位置的指针。然而,字符串仍然具有访问为“string.c_str()”的成员函数,这意味着它本身作为一个对象并不遵循指针的规则。这一切是如何运作的?注意:我原来的问题是不同的,但我把它打出来了。如果有人仍然可以回答我原来的问题只是

c++ - 如果我将 free 与 new 一起使用或将 delete 与 malloc 一起使用,结果会怎样?

是编译错误还是运行时错误?下面的代码可以编译!classBase{voidg();voidh();};intmain(){Base*p=newBase();free(p);return0;}但是,如果我这样声明类Base,它就不能用虚函数编译了classBase{virtualvoidg();voidh();};无论函数是否为虚函数,下面的代码都可以一直编译。classBase{voidg();voidh();};intmain(){Base*p=(Base*)malloc(sizeof(Base));deletep;return0;} 最佳答案

c++ - "new int[];"是做什么的?

这行代码做了什么?newint[];根据我的编译器反汇编(VC++2012),它的作用与:newint[0];但它是C++标准规定的吗?这是合法的指示吗? 最佳答案 表达式newint[]对C++11无效(我没有检查C++14)。对于单个[],语法需要一个(隐式转换为)整数类型expression在方括号之间,表示所需的数组大小。请注意,此大小不必是常量:在抽象的底层,这就是您在C++中分配动态数组的方式。C++11(通过N3290最终草案)§5.3.4/6:”Everyconstant-expressioninanoptr-new

c++ - std::set_new_handler 如何提供更多可用内存?

来自std::set_new_handlernew-handler函数是分配函数在内存分配尝试失败时调用的函数。它的预期目的是三件事之一:提供更多可用内存终止程序(例如通过调用std::terminate)抛出类型为std::bad_alloc或派生自std::bad_alloc的异常下面的重载能保证什么吗?void*operatornew(std::size_tsize)throw(std::bad_alloc){while(true){void*pMem=malloc(size);if(pMem)returnpMem;std::new_handlerHandler=std::set

c++ 构造函数与 new

我犯了一个非常愚蠢的错误,只是将指向一些新内存的指针包装在一个简单的类中。classMatrix{public:Matrix(intw,inth):width(w),height(h){data=newunsignedchar[width*height];}~Matrix(){deletedata;}Matrix&Matrix::operator=(constMatrix&p){width=p.width;height=p.height;data=p.data;return*this;}intwidth,height;unsignedchar*data;}.........//main

c++ - 检测 "new"项目何时被删除

这个问题在这里已经有了答案:HowcanIdetermineifaC++objecthasbeendeallocated?(6个答案)关闭4年前。考虑这个程序:intmain(){structtest{test(){coutSpeak();system("pause");}我原以为会发生崩溃,但实际上却发生了:HelloGoodbyeIsay!我猜这是因为当内存被标记为释放时,它并没有被物理删除,而且由于代码直接引用它,对象仍然在那里,完好无损。在调用Speak()之前进行的分配越多,发生崩溃的可能性就越大。无论出于何种原因,这对我的实际线程代码来说都是一个问题。鉴于上述情况,我如何可

c++ - char *p_c = new char ['1' , '2' , '3' , '4' ]; 的含义

考虑char*p_c=newchar['1','2','3','4'];这个语法正确吗?如果是,那么它有什么作用?我不知道为什么,但是编译器允许这种语法!它对内存有什么影响?我无法通过*p_c访问变量。如何确定存在的元素的大小和数量? 最佳答案 你的代码在语法上是有效的C++,虽然有点奇怪,但我认为它没有达到你的预期:newchar['1','2','3','4']被评估为newchar['4']由于方式逗号运算符有效。(前面的元素是从左到右计算的,但表达式的值是最右边元素的值。)所以你的语句等同于char*p_c=newchar[

c++ - 如何实现具有 placement new 和 emplace 功能的简单容器?

我需要实现一个容器来容纳一定数量的元素,出于某种原因,它必须在没有任何堆分配的情况下工作。另一个要求是,不应以任何方式复制或移动容器元素。它们必须直接构造到容器分配的内存中。为此,我决定使用placementnew并将内存管理完全委托(delegate)给容器实现(在drdobbs找到了一些关于placementnew的有用信息)。找到一个正在运行的例子here.(请注意,使用newuint8_t[size]和std::queue只是为了让示例保持简单。我的真实代码更复杂,无堆而不是实现。)到目前为止,这非常有效,因为客户端代码必须通过以下调用将元素放入容器中:executer.pus

c++ - C++中new和delete的使用

我需要帮助来理解何时应该使用以下选项char*a=newchar();和char*a=newchar[sizeof(int)+1];以及应该如何进行相应的内存释放调用? 最佳答案 任何时候你使用newT,之后你必须在结果指针上调用delete。任何时候你使用newT[n],你都必须在之后对结果指针调用delete[]。这就是它的全部内容。但请注意,您通常根本不应该使用它们。如果你需要一个字符串,不要分配一个字符数组。只需声明一个std::string(不使用new)。如果您需要一个大小在运行时确定的数组,请不要分配数组。声明一个st