动态内存分配被覆盖?

3
我遇到了代码方面的严重问题。我不明白为什么会出现这种情况,也不知道该如何解决。
基本上,我尝试定义一个指向字符的指针数组,其中每个指针数组元素存储不同的字符集。
类构造函数: (注:size是一个整数,它指定我的指针数组应该有多大,用户可以定义它)
storeElements = new char*[size]; 

假设大小为3,现在storeElements应该是一个指向3个不同字符字符串的指针数组。

*storeElements = "one"; 
*(storeElements+1) = "two"; 
*(storeElements+2) = "three"; 

在我赋值后立即打印这些变量时,它们打印出了正确的字符串,但是在我的代码中其他函数和声明多个其他变量之后,打开输出文本文件后,*storeElements 变得混乱不清。

例如,如果我尝试在代码的后面执行以下操作:

cout << *(storeElements+2) << endl;

它可能打印"one"或者什么都不打印,而不是打印"three"。

这里一定存在动态内存分配问题,因为我正在读取文本文件,有时文本文件的内容会被存储到 *storeElements 的元素中,而我根本没有分配它们给 *storeElements。

请帮助我更好地理解如何修复它。我已经投入了大量时间和精力在我的代码上,并且对此感到非常沮丧。谢谢您抽出时间来帮助我。


1
如果您正在使用Linux,valgrind可能会有所帮助。无论如何,将您的代码简化为最少量以重现问题,可以使SO上的人们更有可能提供帮助。 - Erik Alapää
3
有一个猜测是你从文件中读取时,没有分配足够的空间来存储每一行。你尝试过使用std::vector<std::string>>吗? - Bo Persson
2
请从您的代码中提取出一个MCVE,然后发布它。没有实际代码,这是无法回答的。 - Angew is no longer proud of SO
1
我的猜测是:您正在构建临时缓冲区并将其地址存储在storeElements [i]中。当临时缓冲区被删除或用其他内容覆盖时,storeElements [i]仍然指向缓冲区,但指向其他缓冲区内容(字符串)。 - Werner Henze
1
应该是 strcpy(*(storeElements+i),temp.c_str() ); - Arun
显示剩余7条评论
1个回答

2

很简单,你为指针分配了内存,但是你没有为它们所指向的字符数组分配内存。

这行代码完美无误。

storeElements = new char*[size]; 

现在,如果您看一下这行代码:
*storeElements = "one"; 

您还没有分配任何内存来存储“one”。您需要在赋值之前分配内存。可以像下面这样进行分配:
*storeElements = new char[strlen("one")+1];
strcpy_s(storeElements[0], strlen("one")+1, "one");

3
C-字符串不能这样使用。*storeElements = "one"; 这行代码将指针设置为编译器提供的未命名的 const char[] = "one" 的位置。它的数据在程序结束之前一直可用,因此除非您决定修改该字符串,否则这不是问题。实际上,你最后一行代码失去了对前一行分配空间的引用。 - Melebius
我该如何使用strcpy_s?我已经包含了<string.h>和<string>,但它给出了“在作用域中未声明strcpy_s”的错误提示。 - Jared
@Jared 这是C++11的一个新特性。如果不存在,请使用<cstring>(或<string.h>)中的原始strcpy()函数。 - Melebius
当我切换回使用strcpy()时,我会收到一个错误提示:“函数char* strcpy的参数太多”,我认为这是因为在上面的代码中,strcpy_s正在使用3个参数。 - Jared
@Jared 是的,它可以在没有长度参数(中间那个)的情况下工作。http://en.cppreference.com/w/cpp/string/byte/strcpy - Melebius
显示剩余8条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接