我在C++中看到有多种方式来分配和释放数据,我知道当你打电话给malloc你时应该打电话free,当你使用new操作员时你应该配对,delete将两者混合是错误的(例如,调用free()创建的东西)与new操作员),但我不知道何时应该使用malloc/ free何时应该在我的真实世界程序中使用new/ delete.
如果您是C++专家,请告诉我您在此方面遵循的任何经验法则或惯例.
C++注意事项:数组初始化有一个很好的列表初始化列表.我有一个
int array[100] = {-1};
Run Code Online (Sandbox Code Playgroud)
期望它充满-1,但它不是,只有第一个值,其余的是0与随机值混合.
代码
int array[100] = {0};
Run Code Online (Sandbox Code Playgroud)
工作正常,并将每个元素设置为0.
我在这里想念的是什么..如果值不为零,不能初始化它吗?
2:默认初始化(如上所述)是否比通过整个数组的通常循环更快并分配一个值还是做同样的事情?
以下短语在C++中的含义是什么:
零初始化,
默认初始化,和
值初始化
C++开发人员应该了解他们什么?
有这样的代码:
#include <iostream>
int main(){
unsigned int* wsk2 = new unsigned int(5);
std::cout << "wsk2: " << wsk2 << " " << *wsk2 << std::endl;
delete wsk2;
wsk2 = new unsigned int;
std::cout << "wsk2: " << wsk2 << " " << *wsk2 << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
结果:
wsk2: 0x928e008 5
wsk2: 0x928e008 0
Run Code Online (Sandbox Code Playgroud)
我读过new没有用零初始化内存.但似乎它确实如此.它是如何工作的?
我不时需要调用new[]内置类型(通常char).结果是一个具有未初始化值的数组,我必须使用memset()或std::fill()初始化元素.
如何进行new[]默认初始化元素?
在使用new时,有一个帖子在类型名称之后处理括号或不处理括号.但是这个怎么样:
如果'Test'是一个普通的类,那么之间有什么区别:
Test* test = new Test();
// and
Test* test = new Test{};
Run Code Online (Sandbox Code Playgroud)
此外,假设Test2有一个类型参数的构造函数Value,它总是等于写:
Value v;
Test2 *test2 = new Test(v);
// and
Test2 *test2 = new Test{v};
Run Code Online (Sandbox Code Playgroud) 我正在尝试为可变长度的字符串分配内存n.这是我的尝试:
int n = 4; // Realistically, this number varies.
char* buffer = new char[n * 512]();
printf("buffer[0:3] = [%d][%d][%d][%d]\n", buffer[0], buffer[1], buffer[2], buffer[3]);
Run Code Online (Sandbox Code Playgroud)
我的理解是,最后的包含()应该将所有元素初始化为零.但是,我注意到了.这是控制台的输出:
buffer[0:3] = [-120][-85][-45][0]
Run Code Online (Sandbox Code Playgroud)
如何使new初始化程序正常工作?
注意:我知道我可以使用std::fill,但我很好奇为什么new初始化程序不能像宣传的那样工作.
编辑:这是我修改后的方法std::fill,它给出了正确的行为.但我仍然想知道为什么这是必要的.
int n = 4; // Realistically, this number varies.
char* buffer = new char[n * 512]();
std::fill(&buffer[0], &buffer[n * 512], 0)
printf("buffer[0:3] = [%d][%d][%d][%d]\n", buffer[0], buffer[1], buffer[2], buffer[3]);
Run Code Online (Sandbox Code Playgroud)
这输出:
[0][0][0][0]
Run Code Online (Sandbox Code Playgroud) 我尝试为堆和堆栈内存中的10 ^ 7整数分配空间,以查看哪一个更快。显然,在堆内存中分配要快得多,但是我不明白原因。
#include <bits/stdc++.h>
#include <chrono>
using namespace std;
using namespace std::chrono;
int main()
{
high_resolution_clock::time_point t1 = high_resolution_clock::now();
int *p = new int[1e7];
high_resolution_clock::time_point t2 = high_resolution_clock::now();
auto duration = duration_cast<microseconds>( t2 - t1 ).count();
cout << duration / 1e6 << "\n"; // 5e-06
t1 = high_resolution_clock::now();
vector<int> v(1e7);
t2 = high_resolution_clock::now();
duration = duration_cast<microseconds>( t2 - t1 ).count();
cout << duration / 1e6 << "\n"; // 0.112284
return 0;
}
Run Code Online (Sandbox Code Playgroud) 请考虑以下代码:
#include <iostream>
using namespace std;
int main(){
int* p = new int[2];
for (int i = 0; i < 2; i++)
cout << p[i] << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我跑了好几次.它总是产生以下输出:
0
0
Run Code Online (Sandbox Code Playgroud)
我可以假设C++默认初始化将数组元素设置为其默认值吗?在这种情况下,我可以假设p的元素值始终设置为0吗?
我已阅读以下相关问题.但他们并没有专门针对我的案例:
c++ ×10
arrays ×3
new-operator ×3
c++-faq ×2
c ×1
c++11 ×1
constructor ×1
heap-memory ×1
malloc ×1
performance ×1
stack-memory ×1
types ×1