我刚刚开始进入C++,我想养成一些好习惯.如果我刚刚int使用new运算符分配了一个类型的数组,我怎么能将它们全部初始化为0而不用自己循环遍历它们?我应该用memset吗?有没有"C++"方法呢?
new和delete运算符?这是在延续重载new和delete在非常照明C++ FAQ,操作符重载,以及其后续,一个为什么要更换默认的new和delete操作?
第1部分:编写符合标准的new运算符
第2节:编写符合标准的delete运算符
(注意:这是Stack Overflow的C++常见问题解答的一个条目.如果你想批评在这种形式下提供常见问题解答的想法,那么发布所有这些的元数据的发布将是这样做的地方.这个问题在C++聊天室中受到监控,其中FAQ的想法首先开始,所以你的答案很可能被那些提出想法的人阅读.)
注意:答案是基于Scott Meyers的学习'更有效的C++和ISO C++标准.
c++ operator-overloading c++-faq new-operator delete-operator
我想通过malloc方法创建一个整数数组.我希望这个数组是全局的,可以在我的程序中的任何地方使用.我把代码放在一个看起来像这样的头文件中:
static int *pieces;
Run Code Online (Sandbox Code Playgroud)
然后我有一个功能,用我想要的数字填充它.该函数位于命名空间中,命名空间在其自己的.cpp文件中实现.但是,我将头文件导入main.c并从创建数组的命名空间调用该函数,如:
pieces = malloc(sizeof(int) * 128);
Run Code Online (Sandbox Code Playgroud)
但是当我尝试访问main中的数组中的数字时(在调用创建我的数组的函数之后),它崩溃并说没有初始化那些碎片.但是在我拥有的功能中,我可以创建它并操纵它中的数字就好了.我的印象是,通过使片段成为静态变量,只要某个函数在任何地方发生变化(或设置它),那么这将影响变量在任何地方的使用.基本上我想说的是为什么片断在主体中显示未设置,即使我将它设置在我调用的函数中?
我需要动态创建一个整数数组.我发现在使用静态数组时的语法
int a [5]={0};
Run Code Online (Sandbox Code Playgroud)
将所有元素的值正确初始化为0.
有没有办法在创建动态数组时做类似的事情
int* a = new int[size];
Run Code Online (Sandbox Code Playgroud)
而不必遍历数组的所有元素?或者使用for循环赋值仍然是最佳方法?谢谢
我有一个指针分配给指针的双数组.
// pointer to pointer
int **x = new int *[5]; // allocation
for (i=0; i<5; i++){
x[i] = new int[2];
}
for (i=0; i<5; i++){ // assignment
for (j=0; j<2; j++){
x[i][j] = i+j;
}
}
for (i=0; i<5; i++) // deallocation
delete x[i];
delete x;
Run Code Online (Sandbox Code Playgroud)
我试图这样做unique_ptr:
std::unique_ptr<std::unique_ptr<int>[]> a(new std::unique_ptr<int>[5]);
for (i=0; i<5; i++)
a[i] = new int[2];
Run Code Online (Sandbox Code Playgroud)
但一直都是这样说的错误no operator = matches these operands.我在这做错了什么?
我有一个问题.
我在ASIO中开发服务器,数据包是尖头char.
当我创建新的char(例如char * buffer = new char[128];)时,我必须手动将其清理为空值.
通过:
for(int i =0;i<128;i++)
{
buffer[i] = 0x00;
}
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吗?
我已阅读以下相关问题.但他们并没有专门针对我的案例:
我写了一个简单的应用程序来测试内存消耗.在这个测试应用程序中,我创建了四个持续消耗内存的进程,除非进程退出,否则这些进程不会释放内存.
我希望这个测试应用程序消耗大部分RAM内存并导致其他应用程序减速或崩溃.但结果与预期不一样.以下是代码:
#include <stdio.h>
#include <unistd.h>
#include <list>
#include <vector>
using namespace std;
unsigned short calcrc(unsigned char *ptr, int count)
{
unsigned short crc;
unsigned char i;
//high cpu-consumption code
//implements the CRC algorithm
//CRC is Cyclic Redundancy Code
}
void* ForkChild(void* param){
vector<unsigned char*> MemoryVector;
pid_t PID = fork();
if (PID > 0){
const int TEN_MEGA = 10 * 10 * 1024 * 1024;
unsigned char* buffer = NULL;
while(1){
buffer = NULL;
buffer = new unsigned char [TEN_MEGA]; …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用getrusage(.)和最大驻留集大小 (maxrss) 来检查内存泄漏。但是,当我故意尝试造成泄漏时,maxrss 不会改变。也许我对 maxrss 的理解不够深入。这是代码:
#include <iostream>
#include <sys/time.h>
#include <sys/resource.h>
using namespace std;
int main() {
struct rusage r_usage;
getrusage(RUSAGE_SELF, &r_usage);
cout << r_usage.ru_maxrss << "kb\n";
cout << "Allocating...\n";
int a = 100000; // have tried range of numbers
int* memleaktest = new int[a]; // class member
if(!memleaktest)
cout << "Allocation failed";
getrusage(RUSAGE_SELF, &r_usage);
cout << "after allocation " << r_usage.ru_maxrss << "kb\n";
return 0;
}
Run Code Online (Sandbox Code Playgroud)
allocatoin (~15000kb) 后我得到完全相同的值。在 Ubuntu x86 上。
new[]在C++中使用是否将分配的数组初始化为全零?
我的代码是:
#include <iostream>
using namespace std;
int main() {
// your code goes here
int* a;
a = new int[5];
for(int i = 0; i < 5; i++)
cin>>a[i];
for(int i = 0; i < 5; i++)
cout<<a[i]<<" ";
delete[] a;
cout<<"NEW MEM ";
a = new int[5];
for(int i = 0; i < 5; i++)
cout<<a[i]<<" ";
return 0;
}
Run Code Online (Sandbox Code Playgroud)
INPUT:1 2 14 4 5和OUTPUT:1 2 14 4 5 NEW MEM 0 0 14 4 5
请解释为什么我没有得到OUTPUT:1 2 14 …