使用 memset 将其设置为 0 后字符串数组不可用

String array unusable after setting it to 0 using memset

我有一个 class 属性,它是一个字符串数组 (std::string command[10])。当我为它分配一些字符串值时,它会停止程序执行。正如您在下面看到的,我有一个字符串变量 tempCommandStr,我将其分配给 属性。我不知道可能是什么错误,但我有赋值后的打印语句,它从未执行过,而它前面的语句是。

//Declared in class header
std::string command[10];

// Part of function which is causing problem.
string tempCommandStr(commandCharArray);
printf("%s\n", tempCommandStr.c_str()); // Prints fine.
this->command[i] = tempCommandStr; // Something goes wrong here. i is set to some correct value, i.e. not out of range.
printf("%s\n", this->command[i].c_str()); // Never prints. Also program stops responding.

// I noticed that getting any value from the array also stops the execution.
// Just the following statement would stop the program too.
printf("%s\n", this->command[i].c_str());

不只是这​​个属性,我还有一个数组也有同样的问题。是什么原因造成的?到底出了什么问题(看看编辑)?还有其他更好的方法吗?

我是 运行 MBED 上的程序,所以我限制了调试选项。

编辑: 我发现了问题,在使用 memset(command, 0, sizeof(command)); 删除任何以前的值之前,我正在清理数组。这是导致问题的原因。现在我对数组中的每个项目使用 clear 函数,如下所示。这解决了执行问题。

for (int i = 0; i < sizeof(command)/sizeof(*command); i++){
     command[i].clear();
 }

问题:为什么使用memset将字符串数组设置为0会导致无法使用?

Why does setting the string array to 0 using memset makes it unusable?

因为您要删除字符串 class 中保存的值,所以将它们全部覆盖为 0。 std::string 有指向存储字符串、字符计数信息等的内存的指针。如果将 memset() 所有这些设置为 0,它将无法工作。

您来自错误的默认位置。 'zeroing out' 内存有意义(甚至 有用 )操作的类型是特殊的;你不应该指望做这样的事情会带来任何好处,除非这种类型是专门设计用来处理这种事情的。