为什么在有向量时使用这样的新内存位置?
有什么好处吗?
bool* arr = new bool(size);
我不清楚这条线的作用,但我的感受是什么
这std::memset
设置了param2
给出的所有param1
地址从std::memset(arr, 0, sizeof(bool) * (num+1));
开始,到达地址
给定大小
$(document).ready(function(){
(function() {
var itemTracker = {
// init
init: function() {
this.bindEvents();
},
// cacheDom
cacheDom: {
inputAdd: $('#inputAdd'),
submitAdd: $('#submitItem')
},
// item
item: {
text: this.inputAdd.value,
},
// Bind Events
bindEvents: function() {
this.submitAdd.on("click", addItem);
},
// Add item
addItem: function() {
console.log("test");
}
// Remove item
// Edit Item
// Complete Item
// Uncomplete Item
};
itemTracker.init();
})();
});
答案 0 :(得分:4)
为什么在有矢量时使用这样的新内存位置?
我们不能知道为什么作者在这里使用了新的。惯用的方法是使用std::vector<bool>
有什么优势吗?
通常不是,但特别是std::vector<bool>
是有问题的,因为有一种专门化不适用于其他类型。
SO上有很多这样的问题:
我不清楚这条线的作用,但我的感觉......
你的胆量是正确的。
注意:使用bool
分配new
s的连续数组的代码将是
bool* arr = new bool[size];
您可以使用智能指针来分配数组,而不需要关心delete []
:
std::unique_ptr<bool[]> arr{new bool[size]};
答案 1 :(得分:3)
这一行
bool* arr = new bool(size);
的作用是什么?
此行在堆中分配一个布尔值,如果true
则将其初始化为size != 0
,如果false
则将其初始化为size == 0
。然后,它将新分配的布尔值的地址分配给布尔指针arr
。所以没有阵列可以在这里玩。
如何用
new
分配一个布尔数组?
在堆中分配数组的正确方法是使用运算符new[]
。那是你的情况:
bool* arr = new bool[size];
随着智能指针的出现,您还可以使用std::unique_ptr
:
std::unique_ptr<bool[]> arr(new bool[size]);
因此,之后你不必delete []
。
为什么在有向量时使用这样的新内存分配?
除了bool
以外的任何其他类型我都同意,但问题是std::vector<bool>
存在某些问题。
std::vector<bool>
是std::vector<T>
的专业化,主要针对空间效率(有争议)。
然而,它的行为与常规std::vector<T>
相似但不相同。这主要归因于std::vector<bool>
不是通常STL意义上的容器而是位数组。通常情况下,使用std::vector<bool>
可能会导致许多混乱,它被认为是过早优化,甚至会使您的表现变得更糟(请参阅更多详情here)。
另一件事是,在嵌入式系统中,空间是空间的,使用原始数组而不是向量是空间效率方面的更好选择。
std::memset(arr, 0, sizeof(bool) * (size));
怎么样?
std::memset
用地址arr
开始的给定值(即第二输入参数)初始化存储器中的一定数量的字节(即第三输入参数)(即,第一输入参数)。在上面的示例中,它将arr
填充0
s,最多size
个字节。也就是说,如果arr
是一个大小为size
的数组,它会将此布尔数组的所有元素初始化为false
。
无论如何,您可以使用以下方案:
bool* arr = new bool[size]();
^^
或
std::unique_ptr<bool[]> arr(new bool[size]());
因此避免调用原始内存操作符std::memset
,这些操作符属于谨慎使用类别。