繁体   English   中英

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

[英]Debug Assertion Failure even when using delete[]

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

#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;
}

我尝试调试,但发现该错误发生在delete []源; 在removeCharacters函数中。我尝试在线寻找解决方案,但找不到。 为什么会发生此错误? 错误是因为我已经从main分配了动态内存,但是我正在从函数中删除它呢?

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

显然,这将违反上述规则:

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

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

您正在使用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);

请注意,我们创建了两个用数据初始化的缓冲区。 然后,我们仔细地为字符分配足够的存储空间(加上终止符null),而不是对字符进行计数,否则可能会出错。

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

您还有另一个错误:

source=newSource

您将立即看到返回source上没有刚刚分配的指针。 原因是source是一个值参数,因此对于函数来说是局部的-向其赋值对传递给函数的实际值没有任何作用,因为当函数返回时,任何赋值都会冒烟。

另外,如果您是C ++编程的初学者,则可以开始使用std::string而不是char *来获取字符串数据。 使用new[]创建字符串是C ++中的一种恐龙方法。 使用std::string代替。 您确实应该努力不从事创建这样的字符串的工作:

 char *newSource=new char[N1];

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

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

错了 正确的方法是:

    strcpy( source, "Hello how are you" );
    strcpy( remove, "Hi Its me" );

您不能“删除”常量字符串。 您可以删除分配给“ new”的数组/内存。

源通过值传递。 调用delete [] source将不会对main函数中的source产生任何影响。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM