C++中的动态内存问题
Dynamic Memory issue in C++
所以我正在编写一个程序,该程序必须检查输入字符串是否为回文。它实际上正在工作,但是删除我在它的过程中创建的数组时出现了问题。
#include <iostream>
using namespace std;
bool checkPalindrome(char* text);
char* clearString(char* src);
int main()
{
char buffer[1000];
cin.getline(buffer, 1000);
cout << boolalpha << checkPalindrome(buffer) << endl;
return 0;
}
bool checkPalindrome(char* text)
{
char* newStr = clearString(text);
if (!newStr)
return false;
int newLen = strlen(newStr);
for (int i = 0; i < newLen / 2; i++) {
if (newStr[i] == newStr[newLen - i - 1])
continue;
else
return false;
}
//delete[] newStr;
return true;
}
char* clearString(char* src)
{
unsigned len = strlen(src);
unsigned counter = 0;
for (int i = 0; i < len; i++) {
if (src[i] == ' '||src[i] == '.'||src[i] == ','||src[i] == '!')
counter++;
}
unsigned newSize = len - counter + 1;
char* dest = new(nothrow) char[newSize];
if (!dest) {
cout << "not enoough memory\n";
return NULL;
}
int i, j;
for(i = j = 0; j < newSize; ++i, ++j) {
if(src[i]==' '||src[i]=='.'||src[i]==','||src[i]=='!'||src[i]=='?')
i++;
else
dest[j] = src[i];
}
dest[j] = '[=10=]';
return dest;
}
因此,如果执行 checkPalindrome 函数中的注释删除会导致崩溃,并且出现 "Heap corruption detected" 错误。我尝试将函数类型更改为 void 并在那里删除,但同样的事情发生了。知道是什么原因造成的吗?
您的循环复制了字符串末尾的 '[=10=]'
,但随后您添加了另一个 '[=10=]'
,使用的内存比您分配的多一个字节。
所以我正在编写一个程序,该程序必须检查输入字符串是否为回文。它实际上正在工作,但是删除我在它的过程中创建的数组时出现了问题。
#include <iostream>
using namespace std;
bool checkPalindrome(char* text);
char* clearString(char* src);
int main()
{
char buffer[1000];
cin.getline(buffer, 1000);
cout << boolalpha << checkPalindrome(buffer) << endl;
return 0;
}
bool checkPalindrome(char* text)
{
char* newStr = clearString(text);
if (!newStr)
return false;
int newLen = strlen(newStr);
for (int i = 0; i < newLen / 2; i++) {
if (newStr[i] == newStr[newLen - i - 1])
continue;
else
return false;
}
//delete[] newStr;
return true;
}
char* clearString(char* src)
{
unsigned len = strlen(src);
unsigned counter = 0;
for (int i = 0; i < len; i++) {
if (src[i] == ' '||src[i] == '.'||src[i] == ','||src[i] == '!')
counter++;
}
unsigned newSize = len - counter + 1;
char* dest = new(nothrow) char[newSize];
if (!dest) {
cout << "not enoough memory\n";
return NULL;
}
int i, j;
for(i = j = 0; j < newSize; ++i, ++j) {
if(src[i]==' '||src[i]=='.'||src[i]==','||src[i]=='!'||src[i]=='?')
i++;
else
dest[j] = src[i];
}
dest[j] = '[=10=]';
return dest;
}
因此,如果执行 checkPalindrome 函数中的注释删除会导致崩溃,并且出现 "Heap corruption detected" 错误。我尝试将函数类型更改为 void 并在那里删除,但同样的事情发生了。知道是什么原因造成的吗?
您的循环复制了字符串末尾的 '[=10=]'
,但随后您添加了另一个 '[=10=]'
,使用的内存比您分配的多一个字节。