Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ “”中突然出现错误:free():指针无效_C++_Linux_Qt_Pointers_Libgc - Fatal编程技术网

C++ “”中突然出现错误:free():指针无效

C++ “”中突然出现错误:free():指针无效,c++,linux,qt,pointers,libgc,C++,Linux,Qt,Pointers,Libgc,在我的一位同事在我们的项目中加入了一些新功能之后,我遇到了这种分割错误。新特性对以下函数没有影响,但只增加了QString参数的大小。 经过一些调试,我发现在以下函数返回后,分段错误发生了 我需要知道为什么会发生这种情况,为什么我的工作环境有效,以及工作环境是否安全 我必须说,下面的代码片段正在使用GCC4.8开发Qt5.3.1的旧版本,我现在已经用GCC7.0安装了Qt5.9。 它还可以很好地用于调试,而不是Qt上的版本编译模式 最后,我不想讨论这种加密方法的有效性,而是讨论这个问题 崩溃发生

在我的一位同事在我们的项目中加入了一些新功能之后,我遇到了这种分割错误。新特性对以下函数没有影响,但只增加了QString参数的大小。 经过一些调试,我发现在以下函数返回后,分段错误发生了

我需要知道为什么会发生这种情况,为什么我的工作环境有效,以及工作环境是否安全

我必须说,下面的代码片段正在使用GCC4.8开发Qt5.3.1的旧版本,我现在已经用GCC7.0安装了Qt5.9。 它还可以很好地用于调试,而不是Qt上的版本编译模式

最后,我不想讨论这种加密方法的有效性,而是讨论这个问题

崩溃发生在函数返回后,我不知道为什么

QString Utility::encrypt(QString text)
{
    QByteArray textUtf8 = text.toUtf8();

    // Convert QString to Char
    const char *srcString = textUtf8.constData();
    char encrypted[ textUtf8.size() ];

    // Copy Char by Char
    strcpy(encrypted,srcString);
    for(int u=0; u<textUtf8.size(); u++ ){
        encrypted[u]++;
    }

    return QString::fromUtf8(encrypted);
}
我找到的解决办法如下:

char encrypted[ textUtf8.size() + 1 ];
然而,我承认我不知道为什么它会起作用。有人能解释一下吗


有更好的解决方案吗?

问题是text.toUtf8返回的QByteArray中的数据不是以NUL结尾的,strcpy需要以NUL结尾的字符串。。。因为它没有得到一个,所以它会很高兴地将多余的垃圾字节复制到加密数组的末尾,直到它最终在某个地方遇到一个零字节,并损坏堆栈,从而导致函数返回时崩溃

此外,加密数组不够大,无法容纳strcpy要放入其中的NUL字节

修复方法如下所示:

char encrypted[ textUtf8.size() + 1 ];   // +1 to hold the NUL terminator byte
memcpy(encrypted, srcString, textUtf8.size() );
encrypted[textUtf8.size()] = '\0';  // place NUL-terminator byte
[...]

另外,还有一个可移植性说明:动态调整数组大小,因此声明的字符是加密的[textUtf8.size+1];仅因为编译器包含非标准扩展以启用该功能,所以它才适用于您。如果您希望代码能够像所有自尊的Qt代码一样可移植;,您可能希望使用std::vector或其他类似的更高级机制,而不是动态大小的数组。

问题是text.toUtf8返回的QByteArray中的数据不是以NUL结尾的,strcpy需要以NUL结尾的字符串。。。因为它没有得到一个,所以它会很高兴地将多余的垃圾字节复制到加密数组的末尾,直到它最终在某个地方遇到一个零字节,并损坏堆栈,从而导致函数返回时崩溃

此外,加密数组不够大,无法容纳strcpy要放入其中的NUL字节

修复方法如下所示:

char encrypted[ textUtf8.size() + 1 ];   // +1 to hold the NUL terminator byte
memcpy(encrypted, srcString, textUtf8.size() );
encrypted[textUtf8.size()] = '\0';  // place NUL-terminator byte
[...]

另外,还有一个可移植性说明:动态调整数组大小,因此声明的字符是加密的[textUtf8.size+1];仅因为编译器包含非标准扩展以启用该功能,所以它才适用于您。如果您希望代码能够像所有自尊的Qt代码一样可移植;,您可能希望使用std::vector或其他类似的高级机制,而不是动态大小的数组。

char-encrypted[textUtf8.size+1]

由于大小的原因,我们必须使用空字符来终止字符串数组

例如,试试这个

#include<iostream>
#include<string>
using namespace std;
int main()
{
    char textUtf8[5] ="hello";  


}

您将看到字符数组的警告初始值设定项字符串太长

字符加密[textUtf8.size+1]

由于大小的原因,我们必须使用空字符来终止字符串数组

例如,试试这个

#include<iostream>
#include<string>
using namespace std;
int main()
{
    char textUtf8[5] ="hello";  


}

您将看到警告:char数组的初始值设定项字符串太长

另一个奇怪的情况是,如果我插入一个qDebug,那么函数工作得很好,您的代码中正在发生一些内存损坏。如果不知道函数中的大小是如何计算的,很难说是什么原因造成的。请注意,字符串需要比其长度多1个字符才能在结尾保留“\0”。这就好像您忘记了以非加密方式将其添加到加密字符串的末尾,。运行一个内存检查工具和/或调试器。另一个奇怪的情况是,如果我插入一个qDebug,那么该函数可以很好地工作。您的代码中正在发生一些内存损坏。如果不知道函数中的大小是如何计算的,很难说是什么原因造成的。请注意,字符串需要比其长度多1个字符才能在结尾保留“\0”。这就好像您忘记了以非加密方式将其添加到加密字符串的末尾,。运行内存检查工具和/或调试器。