可能重复:
(POD)释放内存:删除[]是否等于删除?
当我被教授C++时,这是很久以前的事了.我被告知从不使用,delete但delete[]因为delete[]在单个对象上执行将相当于delete.我不知道是不是太信任老师了,这是真的吗?
有没有理由打电话delete而不是delete[]?
我已经在SO中扫描了可能相关的问题,但没有找到任何明确的答案.
IP_ADAPTER_INFO *ptr=new IP_ADAPTER_INFO[100];
Run Code Online (Sandbox Code Playgroud)
如果我免费使用
delete ptr;
Run Code Online (Sandbox Code Playgroud)
它会导致内存泄漏,如果不是那么为什么?
这是VS2005生成的反汇编代码
; delete ptr;
0041351D mov eax,dword ptr [ptr]
00413520 mov dword ptr [ebp-0ECh],eax
00413526 mov ecx,dword ptr [ebp-0ECh]
0041352C push ecx
0041352D call operator delete (4111DBh)
00413532 add esp,4
; delete []ptr;
00413535 mov eax,dword ptr [ptr]
00413538 mov dword ptr [ebp-0E0h],eax
0041353E mov ecx,dword ptr [ebp-0E0h]
00413544 push ecx
00413545 call operator delete[] (4111E5h)
0041354A add esp,4
Run Code Online (Sandbox Code Playgroud) 我已经写了包含两个指针类,一个是char* color_和一个在vertexesset* vertex_那里vertexesset是一类我创建.在我开始写的destractor中
delete [] color_;
delete [] vertex_;
Run Code Online (Sandbox Code Playgroud)
当它来到析构函数时,它给了我一个分段错误.
然后我将析构函数更改为:
delete [] color_;
delete vertex_;
Run Code Online (Sandbox Code Playgroud)
现在它工作正常.两者有什么区别?
这个问题一直困扰着我.我一直认为C++应该被设计成使"删除"操作符(没有括号)即使使用"new []"运算符也能工作.
在我看来,写这个:
int* p = new int;
Run Code Online (Sandbox Code Playgroud)
应该相当于分配1个元素的数组:
int* p = new int[1];
Run Code Online (Sandbox Code Playgroud)
如果这是真的,"删除"运算符可能总是删除数组,我们不需要"delete []"运算符.
是否有任何理由在C++中引入"delete []"运算符?我能想到的唯一原因是分配数组的内存占用量很小(你必须在某处存储数组大小),因此区分"delete"与"delete []"是一个很小的内存优化.
首先,根据C++标准,使用delete分配的任何内容new[]都是未定义的行为.
在Visual C++ 7中,这种配对可能导致两种后果之一.
如果类型new []'ed有简单的构造函数和析构函数VC++只是使用new而不是new[]和使用delete该块工作正常 - new只调用"分配内存",delete只调用"空闲内存".
如果new []'ed类型有一个非平凡的构造函数或析构函数,则无法完成上述技巧 - VC++ 7必须调用恰当数量的析构函数.因此它预先在数组中size_t存储元素的数量.现在,地址返回的地址new[]到第一个元素,而不是块的开头.因此,如果delete使用它只调用第一个元素的析构函数和调用"空闲内存",其地址不同于"分配内存"返回的地址,这导致HeapFree()内部的一些错误指示我怀疑是指堆腐败.
然而,每个人都可以阅读使用deleteafter new[]导致内存泄漏的错误陈述.我怀疑任何大小的堆损坏都比仅为第一个元素调用析构函数并且可能没有调用的析构函数没有释放堆分配的子对象这一事实重要得多.
如何使用delete之后new[]可能只会导致某些C++实现中的内存泄漏?
是否有区别:
operator delete(some_pointer);
Run Code Online (Sandbox Code Playgroud)
和
delete some_pointer;
Run Code Online (Sandbox Code Playgroud)
如果是这样,有什么区别,哪一个应该使用一个以及该运营商的另一个版本?谢谢.
我看到了一个使用函数的例子:在cpp中删除,我并没有完全理解它.代码是:
class Name {
const char* s;
//...
};
class Table {
Name* p;
size_t sz;
public:
Table(size_t s = 15){p = new Name[sz = s]; }
~Table { delete[] p; }
};
Run Code Online (Sandbox Code Playgroud)
什么是命令的具体行动:delete[] p;?
我认为目的是删除容器表中的所有指针.
括号中delete[]给出了一个线索,它删除了一个指向Name的指针数组,但没有指定数组的大小,那么析构函数如何"知道"要删除多少指针?
因此,在尝试学习如何在C++中使用C-Strings时,我遇到了内存分配问题.
这里的想法是创建一个新的字符串格式(s1 + sep + s2)我正在使用的文本提供了标题,所以我不能改变它,但我遇到了试图设置大小的问题char str [].我收到一个错误,说sLength不是常量,因此不能用于设置数组的大小.我对C++比较陌生,所以这是一个两部分问题.
这个策略实际上是为新阵列分配内存吗?
如果使用strlen(char*)无法获得常量值,如何正确设置数组大小?
char* concatStrings(char* s1, char* s2, char sep){
int sLength = strlen(s1) + strlen(s2) + 3;
//+1 for char sep +2 for \0 at end of string
char *str = new char[sLength];
strcpy (str, s1);
str [sLength(s1)] = sep;
strcat (str, s2);
return str;
}
Run Code Online (Sandbox Code Playgroud)编辑,所以现在我没有编译错误,但...
对函数的调用如下:
char* str = concatStrings("Here is String one", "Here is String two" , c);
cout<< str;
Run Code Online (Sandbox Code Playgroud)
我的输出成为:
这里是String onec ================== 22221/21/21/21/2/(等) /这里是String 2
int* arr = new int[count];
delete arr;
Run Code Online (Sandbox Code Playgroud)
为什么这样做?我已经检查过,它实际上释放了内存.从我所读到的,我需要,delete[] arr;否则它实际上不会释放所有的记忆.
每隔1秒钟,功能就会起作用。
我的系统是linux。跑步突然死亡。
-----global-------
static int arrayNum[33000];
-------------------
function(){
unsigned short int** US_INT;
US_INT= new unsigned short int*[255];
for(int i = 0; i < 255; i++)
{
US_INT[i] = new unsigned short int[128];
memset(US_INT[i], 0, sizeof(unsigned short int) * 128);
}
double x;
double y;
int cnt= 0;
int nArrayCount=0;
for(int i = 0; i < 255; i++)
{
for(int j=0;j<128;j++){
x=j;
y=cnt
nArray[nArrayCount]=US_INT[i][j];
nArrayCount++;
}
cnt=cnt+(256/255);
}
for(int i = 0; i < 255; i++)
{
delete US_INT[i];
}
delete[] …Run Code Online (Sandbox Code Playgroud)