即使使用delete [],也会调试断言失败

0 c++ visual-studio-debugging

我是编程的初学者,最近编写了这段代码

#include<iostream>
using namespace std;


void removeAllCharacters(char * , char * );
void printArray(char*);

void deleteArrays(char*,char*);

int main()
{
            char * source,*remove;
            source=new char[18];
            remove=new char[10];

            source="Hello how are you";
            remove="Hi Its me";

            removeAllCharacters(source,remove);
            printArray(source);

            deleteArrays(source,remove);
            system("pause");
            return 0;
}

void removeAllCharacters(char * source, char * remove)
{
            int N1=strlen(source)+1;
            int N2=strlen(remove)+1;

            bool arr[128] = {false};

            for(int i=0;i<N2-1;i++)
            {
                arr[remove[i]]=1;
            }

            char *newSource=new char[N1];

            for(int i=0,j=0;i<N1-1;i++)
            {
                if(arr[source[i]]==0)
                {
                    newSource[j++]=source[i];
                }
            }

            delete  [] source;
            source=newSource;
            newSource=0;
}

void printArray(char* arr)
{
            int N=strlen(arr)+1;

            for(int i=0;i<N;i++)
            {
                cout << arr[i];
            }

            cout << endl << endl;
}

void deleteArrays(char* arr1,char*arr2)
{
            delete [] arr1;
            arr1=0;
            delete[]arr2;
            arr2=0;
}
Run Code Online (Sandbox Code Playgroud)

我试过调试,发现只有 在delete [] source发生了错误; 在removeCharacters函数中.我试图在线寻找解决方案,但我找不到它.为什么会出现此错误?是错误,因为我从main分配了动态内存,但我从函数中删除它?

Pau*_*zie 5

返回值new[]是指针值.无论发生什么情况,当您发出对delete[]同一个指针的调用时,必须使用值.

显然这会违反上述规则:

    source=new char[18];
    remove=new char[10];

    source="Hello how are you";
    remove="Hi Its me";
Run Code Online (Sandbox Code Playgroud)

您正在分配new[],但用字符串文字的值替换返回的值.换句话说,调用所需的指针值delete[]现在已经消失.

以下是您应该做的事情的示例:

    char str1[] = "Hello how are you";
    char str2[] = "Hi Its me";
    source=new char[sizeof(str1)];
    remove=new char[sizeof(str2)];
    strcpy(source, str1);
    strcpy(remove, str2);
Run Code Online (Sandbox Code Playgroud)

请注意,我们创建了两个使用数据初始化的缓冲区.然后我们小心地为字符分配足够的存储空间(加上终止空值),而不是计算字符数,可能会出错.

然后该strcpy函数将字符复制到另一个缓冲区.

您还有另一个错误:

source=newSource
Run Code Online (Sandbox Code Playgroud)

您将立即看到返回时source没有您刚刚分配的指针.原因是它source是一个值参数,因此是函数的局部参数 - 赋值给传递给函数的实际值没有任何作用,因为当函数返回时,任何赋值都会在一阵烟雾中上升.

另外,你是C++编程的初学者,你可以开始使用std::string而不是字符串数据的char*.使用new[]C++中的恐龙方法创建字符串.请std::string改用.你真的应该努力不进入创建这样的字符串的业务:

 char *newSource=new char[N1];
Run Code Online (Sandbox Code Playgroud)

这会导致内存泄漏,有时会出现类似意大利面条的逻辑,以便跟踪分配的内存,以便delete[]正常运行.此外,大多数(如果不是所有这些问题)都会消失.分配工作,没有内存泄漏等.