我是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 += "<";
else if(crntStr[j] == '>')
newStr += ">";
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):错误C2131:表达式未求值为常数 c:\ users \ hamza \ source \ repos \ hypertextformatting \ hypertextformatting \ hypertextformatting.cpp(32):注意:失败是由于在其生存期之外读取变量引起的 c:\ users \ hamza \ source \ repos \ hypertextformatting \ hypertextformatting \ hypertextformatting.cpp(32):注意:请参阅“大小”的用法
答案 0 :(得分:1)
仅堆上的内存分配(或动态分配)可能导致内存泄漏。声明数组字符串时,strArr [size];它将被放置在堆栈上,并在程序离开当前作用域时自动“释放”(堆栈指针将减小strArr大小)并调用desctructor。尽管“字符串”对象数据放置在动态分配的内存中,但析构函数将释放它。内存泄漏在这里是不可能的。 如果通过new,new [],malloc等调用在堆中分配内存,则会造成内存泄漏,而在不再需要它们后忘记释放数据。
所以
string strArr[size]; // no leaks
string* strArr = new string[size]; //may be leak if you forget call delete[] strArr
此外,可变长度数组在C ++中是非标准的,请避免使用它!