gpt4 book ai didi

c++ - 你可以在Windows中对字符串进行 `memset()`吗?

转载 作者:太空宇宙 更新时间:2023-11-04 04:37:22 25 4
gpt4 key购买 nike

我正在努力将一些内容移植到 Linux,并且我在代码中发现了一个相当有趣的错误,该错误显然可以在 Windows 上运行,但不能在 Linux 上运行。带有一些字符串成员的类正在通过 memset(this) 进行初始化,这显然可以在 Windows 上运行,但在 Linux 上会在字符串析构函数中引发段错误。

是的,我知道使用 memset() 这是一种可怕的做法,我正在修复它。

SSCCE:

#include <iostream>
#include <cstring>

int main()
{
std::string tmp;
std::cout << "String instantiated" << std::endl;
memset(&tmp, 0, sizeof(tmp));
std::cout << "String memset" << std::endl;

return 0;
}

这在 Windows 上运行良好,但字符串析构函数在 Linux 上出现段错误。

编译器:

  • MSVC++ 2013(适用于 x64 的 Microsoft (R) C/C++ 优化编译器版本 18.00.31101)
  • g++(Ubuntu 4.8.2-19ubuntu1)4.8.2

我知道无论哪种方式,这都是(而且仍然是)可怕的做法,但它最初是如何运作的?

最佳答案

如果您想深入了解实现细节,MSVC 和 Clang(带有 libc++)使用 string 进行短字符串优化,大致如下所示:

class string {
size_t length;
char* ptr;
char short_buf[N];
};

因此,如果它是 memset0,它的析构函数会认为它的长度为零,并且可能不会执行任何操作,而且即使它尝试 delete[] ptr,它也不会崩溃,因为 delete 对于空指针可以正常工作。

相反,GCC 直到最近才使用完全不同的字符串 实现,其中涉及写入时复制和引用计数。所以它的内部结构要复杂得多,在memset之后崩溃也就不足为奇了。

关于c++ - 你可以在Windows中对字符串进行 `memset()`吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29831418/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com