C++ 使用查找和替换程序检测到堆损坏

C++ 使用查找和替换程序检测到堆损坏,c++,memory-management,heap,C++,Memory Management,Heap,我有一个查找和替换程序,有时可以运行,但后来我开始出现以下错误:检测到堆损坏:在地址处的正常块(#142)之后。CRT检测到应用程序在堆缓冲区结束后写入内存 我不太确定问题出在哪里,因为每次分配内存时,我都会取消分配内存。我一定错过了什么。如果任何人有任何建议,将不胜感激。以下是完整的代码: #include <iostream> #include <string> using namespace std; void optimize(char*, const char

我有一个查找和替换程序,有时可以运行,但后来我开始出现以下错误:检测到堆损坏:在地址处的正常块(#142)之后。CRT检测到应用程序在堆缓冲区结束后写入内存

我不太确定问题出在哪里,因为每次分配内存时,我都会取消分配内存。我一定错过了什么。如果任何人有任何建议,将不胜感激。以下是完整的代码:

#include <iostream>
#include <string>
using namespace std;

void optimize(char*, const char*, const char*);
bool oldStrValidate(char*, string);

int main()
{
string input, old_str, new_str;
bool oldStrValid = false;
string repeat;

do
{
    cout<<"Enter a string: "<<endl;
    getline(cin,input);
    char* inputPtr = new char[input.length() +1];
    strcpy(inputPtr, input.c_str());



    do
    {
        cout<<"Enter the section of the string you wish to replace."<<endl;
        getline(cin, old_str);
        oldStrValid = oldStrValidate(inputPtr, old_str);
    }while(oldStrValid == false);
    cout<<"What would you like to replace\"" <<old_str<<"\" with?"<<endl;
    getline(cin,new_str);
    char* oldPtr = new char[old_str.length() +1];
    strcpy(oldPtr, old_str.c_str());
    char* newPtr = new char[new_str.length() +1];
    strcpy(newPtr, new_str.c_str());
    optimize(inputPtr, oldPtr, newPtr);
    cout<<"          try again? \"y\" for yes or \"n\" to quit." << endl;
    cout<<"          : ";
    cin>>repeat;
    cin.ignore();
    delete [] inputPtr;
    delete [] oldPtr;
    delete [] newPtr;
}while(repeat == "y");

return 0;
  }


void optimize( char* input_str, const char* old_str, const char* new_str  )
{
string input_string(input_str);
string old_string(old_str);
string new_string(new_str);
size_t position = 0;

while ((position = input_string.find(old_string, position)) != string::npos)
{
  input_string.replace( position, old_string.length(), new_string );
  position += new_string.length();
}

strcpy(input_str, input_string.c_str());
cout << input_string << endl;
}
bool oldStrValidate(char* str, string searchFor)
{
string input(str);
int position = 0;

while ((position = input.find(searchFor, position)) != string::npos)
    return true;

{
    cout<<"the substring you enterd does not exist within the string"<<endl;
    return false;
}

} 
#包括
#包括
使用名称空间std;
void优化(char*,const char*,const char*);
bool-oldStrValidate(字符*,字符串);
int main()
{
字符串输入,旧字符串,新字符串;
bool oldStrValid=false;
字符串重复;
做
{

cout如果我不得不猜测的话,我会说这是由您将一个小字符串替换为一个没有空间容纳的大字符串引起的,具体来说就是在
optimize()
中的这一行损坏堆:


strcpy(input_str,input_string.c_str());

如果非要我猜的话,我会说这是由于您将一个小字符串替换为一个没有空间容纳的大字符串造成的,特别是在
optimize()
中的这一行损坏了堆:


strcpy(input_str,input_string.c_str());

您可能需要考虑当您输入字符串
“a”
时会发生什么,然后用类似
的内容替换
a
。此字符串太长了

<>你会发现,C++字符串处理得相当好,C字符串也不能这么说。当你执行这行时:

strcpy(input_str, input_string.c_str());
扩展字符串被复制到(非常未扩展的)
input\u str
缓冲区,因此堆损坏


整个C++的字符串点是为了防止很多人使用更原始的C字符串,所以我不完全清楚为什么你要回到旧的方法。你最好使用C++字符串到处。否则你必须确保你自己管理空间。< /P> < P>你可能想考虑什么会HAPP?en当您输入字符串

“a”
,然后用类似
的内容替换
a
时,此字符串太长了

<>你会发现,C++字符串处理得相当好,C字符串也不能这么说。当你执行这行时:

strcpy(input_str, input_string.c_str());
扩展字符串被复制到(非常未扩展的)
input\u str
缓冲区,因此堆损坏


<> P>整个C++的字符串点是为了防止很多人使用更原始的C字符串,所以我不完全清楚为什么你要回到旧的方法。你最好使用C++字符串到处。否则你必须确保你自己管理空间。< /P>请缩进你的代码。为什么这么多拷贝O?f字符串?Yikes!“每次我分配内存时,我也会释放它。”这太棒了,但这不是堆损坏错误所抱怨的。它说:“CRT检测到应用程序在堆缓冲区结束后写入内存。”请缩进代码。为什么要复制这么多字符串?Yikes!“每次我分配内存时,我也会释放它。”这太棒了,但这不是堆损坏错误所抱怨的。它说:“CRT检测到应用程序在堆缓冲区结束后写入内存。”根据函数名,这显然是一种优化:如果不需要(想要),为什么要分配更多内存to?!:DPer显然是一个优化的函数名:如果不需要(想要)为什么要分配更多内存?!:D