草庐IT

new_order

全部标签

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

c++ - 使用malloc代替new,创建对象时调用拷贝构造函数

我想试用TBB的scalable_allocator,但是当我不得不替换我的一些代码时感到困惑。这是使用分配器完成分配的方式:SomeClass*s=scalable_allocator().allocate(sizeof(SomeClass));编辑:上面显示的不是使用scalable_allocator完成分配的方式。作为ymettcorrectlymentioned,分配是这样完成的:intnumberOfObjectsToAllocateFor=1;SomeClass*s=scalable_allocator().allocate(numberOfObjectsToAlloca

c++ - std::notify_one() 中的 "a single total order"是什么意思?

我已阅读Concurrency:AtomicandvolatileinC++11memorymodel和Howstd::memory_order_seq_cstworks,它没有多大帮助,直接回答我的问题。来自https://en.cppreference.com/w/cpp/thread/condition_variable/notify_one:Theeffectsofnotify_one()/notify_all()andeachofthethreeatomicpartsofwait()/wait_for()/wait_until()(unlock+wait,wakeup,and

c++ - 返回空指针的用户定义的 operator new

我知道那里有相当多的C++常见问题解答(以及关于SO的答案)说没有必要检查普通new表达式的返回值是否为null,因为普通new表达式通过抛出异常来指示失败。他们基本上声明普通的new表达式永远不会返回null。(“普通新表达式”是指不是nothrow的新表达式)。然而,尽管这看起来像是一个非常基本的问题,但我突然意识到我不明白他们在给出答案时所做的具体假设(如果有的话)。特别是,我想知道是否允许我重载::operatornew的基本普通形式以始终返回空指针,因此期望所有使用该运算符的普通new表达式都将现在也返回空指针。根据语言规范,如果我的::operatornew被声明为非抛出,

c++ - 比较算法的执行时间 : why does the order of execution matter?

每当我尝试比较两个竞争算法(使用C++)的执行时间时,我都会使用std::chrono作为以前在这个问题中建议的示例:MeasuringexecutiontimeofafunctioninC++但是,我总是注意到被比较算法的执行顺序对执行时间有显着影响。它甚至经常改变哪些竞争算法被认为是最快的。例如,假设我有两个算法algo1和algo2。我的意思是下面的代码:std::chrono::high_resolution_clock::time_pointstart0,start1;std::chrono::high_resolution_clock::time_pointend0,end

c++ - 如何在可能使用 placement new 的同时创建数组

我一直致力于创建一个自定义分配器作为一项有趣的练习/实践,我在创建数组时遇到了两个潜在的问题。对于典型的分配调用,我将使用malloc和placementnew。但是,当我去创建一个数组时,我对应该如何完成感到困惑。有一次,我注意到在某些地方似乎placementnew对于数组(例如here)可能不安全.在尝试对数组使用placementnew时,我也遇到了自己的错误。我会得到错误`errorC2679:binary'=':nooperatorfoundwhichtakesaright-handoperandoftype'SomeClass*'(orthereisnoacceptabl