gpt4 book ai didi

c++ - c++数组也可以泄漏内存吗?

转载 作者:行者123 更新时间:2023-11-28 04:28:37 24 4
gpt4 key购买 nike

我是 c++ 的新手,我一直在无所畏惧地进行实验,直到我看到关于内存泄漏和其他东西会使我的计算机崩溃的 cs50 讲座,我用 PHP 和 javascript 编程,我猜这些东西不存在,这是我写的程序:

int main(int argc, char** argv) {

ifstream inFile;

ofstream outFile;

int size;

inFile.open("text.txt"); //Step 2

outFile.open("formated.out"); //Step 3

//这里我通过 PHP 发送文件,文件的第一行是文件中的行数

inFile >> size;

size += 1;

string strArr[size];

for(int i = 0;i < size;i++){
getline(inFile, strArr[i]);
}

string crntStr;
int sl;
string newStr;
for(int i = 1;i < size;i++){

newStr = "";

string crntStr = strArr[i];

sl = crntStr.length();

for(int j = 0;j < sl;j++){

if(crntStr[j] == '<')
newStr += "&lt;";
else if(crntStr[j] == '>')
newStr += "&gt;";
else
newStr += crntStr[j];

}

cout << newStr << endl;

if(i != (size - 1))
cout << "<br>";

}

return 0;
}

我的问题是,当我编写此类程序时是否应该担心内存泄漏,我在 devc++ 中编译了该程序并且它工作正常但是当我去 visual studio 时出现以下错误:c:\users\hamza\source\repos\hypertextformatting\hypertextformatting\hypertextformatting.cpp(32): error C2131: 表达式未计算为常量 c:\users\hamza\source\repos\hypertextformatting\hypertextformatting\hypertextformatting.cpp(32): 注意:失败是由于在其生命周期之外读取变量引起的 c:\users\hamza\source\repos\hypertextformatting\hypertextformatting\hypertextformatting.cpp(32): 注意:查看 'size' 的用法

最佳答案

只有堆上的内存分配(或动态分配)才会导致内存泄漏。当你声明一个数组 string strArr[size];它将被放置在堆栈上,并在程序离开当前范围时自动“释放”(堆栈指针将减少 strArr 大小)并且将调用 descstructor。尽管“字符串”对象数据放置在动态分配的内存中,但它会被析构函数释放。内存泄漏在这里是不可能的。如果您通过 new、new[]、malloc 等调用在堆中分配内存并且在不再需要数据后忘记释放它们,则可能会造成内存泄漏。

所以

string strArr[size]; // no leaks
string* strArr = new string[size]; //may be leak if you forget call delete[] strArr

此外,可变长度数组在 C++ 中是非标准的,请避免使用它!

关于c++ - c++数组也可以泄漏内存吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53616815/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com