草庐IT

new_list

全部标签

使用 "new"的 C++ 动态内存分配

我是C++的新手,正在尝试自学(我有Java背景)。有动态内存分配的概念,我可以使用new分配给一个数组(例如)。在C(以及C++)中,我有malloc和realloc正在执行此操作。在C++中,出于某种我无法理解的原因,他们添加了new。我已经阅读了很多有关进入堆栈的普通数组与进入堆的动态分配数组之间的区别的文章。所以我的理解是,通过使用new我在堆中分配空间,当完成一个函数时不会自动删除,但会保留在原处直到我最后,手动释放它。我找不到在普通内存上使用动态内存分配的实际例子。据说我在使用普通数组时无法通过运行时分配内存。好吧,可能我没有理解正确,因为当我尝试创建一个普通数组(没有ne

c++ - initializer_list 结合其他参数

假设我有一个类,它在构造函数中采用T类型的参数和U类型的参数集合。以下解决方案有效:structQ{Q(Tt,std::initializer_listus);};创建此类的实例将是:Qq{t1,{u1,u2,u3,u4}};但这对我来说看起来有点不干净。有比这个更好的解决方案吗? 最佳答案 您需要的是可变参数模板(c++11特性)。#includestructT{};structU{};classQ{public:templateQ(Tt,ArgTypes...args):Q(t,{args...}){}private:Q(Tt,

c++ - 为什么 new 关键字返回指针而不是引用?

我知道new关键字返回指针,所以返回类型是void*。我的愚蠢问题是,为什么new必须返回void*而不是void&?意思是当对象由new创建时,他们可以使用&运算符的地址返回该对象的地址。我知道指针和引用之间的区别。但最后我们使用指针而不是引用。请消除我的困惑谢谢。 最佳答案 New返回一个你用来在内存中分配空间的任何类型的指针,而不是void*autop1=newint[5];//returnsapointertoanintpointingtothe1stelementautop2=newshort[5];//returnsap

c++ - list 和 forward_list 性能之间的区别?

与c++11一样,我们有两种类型的列表:std::listlst={1,2,3,4,5};std::forward_listflst={5,4,3,2,1};我们知道list是基于双向链表的,forward_list是基于单向链表的。我们应该如何决定使用哪一个?以上任何列表是否有任何性能优势? 最佳答案 Howshouldwedecidewhichonetoused?决定是否需要双向迭代。如果前向迭代足够好,请使用std::forward_list,除非您需要支持早于C++11的C++版本,后者可能只有std::list。Isthe

c++ - malloc 和 new 的实现差异。堆栈实现?

分配内存时,如果内存不可用,new运算符会抛出异常。另一方面,malloc返回NULL。执行差异的原因是什么。另外,在静态内存分配上,即在堆栈上,如果我们用完内存是否会出现异常?我已经浏览过链接Whatisthedifferencebetweennew/deleteandmalloc/free?但是没有得到我关于两者实现上的区别的答案 最佳答案 C代码的问题在于您应该检查函数的返回值以确保它们正常工作。但是编写的很多代码都没有检查返回值,结果在您最意想不到的时候炸毁了。在最坏的情况下,它甚至不会立即崩溃,而是继续在错误下游数英里的某

c++ - 嵌套的 std::initializer_lists 的数据元素是否保证是连续的?

可以通过嵌套大括号括起来的列表来创建多维初始化器,如{{1,2,3},{4,5,6}}中所示。接受它的函数可以使用嵌套的std::initializer_list编写。是否保证数据元素是连续的?这是一个例子:voidf(std::initializer_list>a){for(autoconst&p:a)for(autoconst&q:p)std::cout上面的代码在我的机器上输出了连续的地址。0x400c600x400c640x400c680x400c6c0x400c700x400c74有保证吗?更新答案一定是否定的。voidg(std::initializer_lista,std

Java 将 List 转换为 String常见方式

将List转换为String的几种方式使用List的toString()方法将List转换为String;结果前后会带有英文的中括号[],如:[1,2,3,4,5]使用Java8stream流中的Collections.joining()方法,带有逗号分隔符或自定义分隔符将集合转成String字符串使用String.join()方法将带有逗号分隔符或自定义分隔符的集合转换为字符串使用Apachecommons包下的StringUtils.join()方法;转成的String结尾带有分隔符小尾巴,如:"张三,李四,"使用StringBuilder、StringBuffer的append方法自定义

c++ - 我是否需要删除使用 new 和 placement 构造的对象

classFoo{//somememberpublic:intbar;}intmain(){char*buffer=newchar[100];Foo*f=new(buffer)Foo();//doihavetodeletef;//orisdelete[]buffer;//enough}当然,如果删除Foo对系统有一些重大影响,我必须删除它,但可以说它是一个简单的存储对象,我将其完全放在缓冲区内并且没有确实删除了一些其他东西的析构函数。我是否必须删除一个放置在新内部的对象是否足以删除缓冲区?如果我必须对缓冲区内的每个对象调用delete,为什么我必须这样做吗?我读到:what-uses-

c++ - 使用 new 运算符定义 std::shared_ptr 时出错

我正在尝试通过以下方式使用new运算符定义std::shared_ptr:#includestructA{};intmain(){std::shared_ptrptr=newA();return0;}但我得到了以下编译时错误:main.cpp:Infunction'intmain()':main.cpp:8:30:error:conversionfrom'A*'tonon-scalartype'std::shared_ptr'requestedstd::shared_ptrptr=newA();无论如何,以下绝对有效:std::shared_ptrptr{newA()};有谁知道为什么

c++ - std::list 和 std::map 的通用算法?

我有一个感兴趣的类(称之为X)。我有一个std::list(称之为L)。我有一个函数(称之为F)。F(L)根据检查列表中每个X的内部状态的算法返回L的一个子集(一个std::list)。我正在向我的应用程序添加一个std::map(称之为M),我需要定义F(M)以与F(L)相同的方式运行——即也就是说,F(M)也必须返回一个std::list,这是通过检查映射中每个X的内部状态来确定的。作为一个自称懒惰的程序员,我立即看到算法将[逻辑上]相同,并且每种数据类型(std::list和std::map)都是可迭代的模板。我不想两次维护相同的算法,但我不确定如何前进。一种方法是从F(M)中获