c++ - 指针数组输出整数变量没有问题,但字符串都是空的
问题描述
我是 C++ 新手,并且有一个使用 Oldie McOldSchool 数组和指针的作业。我已经累计研究了这个具体问题大约 8-12 个小时,有点想把我的脸推到砖墙上,现在真的不知道该怎么想。我希望得到 SO 专家的帮助!
我有以下课程
#include <iostream>
#include <string>
using namespace std;
#include "mainclass.h"
#include "mysubobject1.h"
const string dataString[] =
{
"stringvalue,stringvalue,stringvalue,stringvalue,19,51,36,41,STUFF1",
"stringvalue,stringvalue,stringvalue,stringvalue,19,52,37,44,STUFF2",
"stringvalue,stringvalue,stringvalue,stringvalue,19,53,38,46,STUFF3",
"stringvalue,stringvalue,stringvalue,stringvalue,19,54,39,49,STUFF1",
"stringvalue,stringvalue,stringvalue,stringvalue,19,55,30,38,STUFF2",
};
MyObject* myObjectArray[5];
const string* dataArray[5];
int delimiterPositionArray[5][9];
string tokenArray[5][9];
Stuff stuff;
void main()
{
MainClass* mainClass = new MainClass();
dataArray[0] = &dataString[0];
dataArray[1] = &dataString[1];
dataArray[2] = &dataString[2];
dataArray[3] = &dataString[3];
dataArray[4] = &dataString[4];
/*Parse the contents of string into Token array. I have this working and can share if necessary but trimmed it out to keep this easy to look at */
for (int i = 0; i < 5; i++)
{
/* Logic to set the value of stuff goes here - it's very simple and trimmed for ease of reading */
mainClass->add(tokenArray[i][0], tokenArray[i][1], tokenArray[i][2], tokenArray[i][3], stoi(tokenArray[i][4]), stoi(tokenArray[i][5]), stoi(tokenArray[i][6]), stoi(tokenArray[i][7]), stuff);
}
cout << "TEST" << endl;
cout << mainClass->myObjectArray[0] << endl;
}
void MainClass::add(string string1, string string2, string string3, string string4, int int1, int int2, int int3, int int4, Stuff stuff)
{
MyObject myObject;
if (stuff == STUFF2) {
MySubObject1 myObject;
myObject.SetStuff(stuff);
}
myObject.SetString1(string1);
myObject.SetString2(string2);
myObject.SetString3(string3);
myObject.SetString4(string4);
myObject.SetInt1(int1);
int* intArray[] = { &int2, &int3, &int4 };
myObject.SetIntArray(intArray);
//Awful temporary array filling logic (which doent work properly, but works for the purpose of testing this problem)
if (myObjectArray[0] == nullptr)
{
myObjectArray[0] = &myObject;
}
else
{
if (myObjectArray[1] == nullptr)
{
myObjectArray[1] = &myObject;
}
/* ….until the array is filled */ }
}
问题是:
当我从 VB 调试器的 mainclass.cpp 中的 main 方法中检查这行代码时,一切看起来都很完美。令牌数组包含我所期望的:
mainClass->add(tokenArray[i][0], tokenArray[i][1], tokenArray[i][2], tokenArray[i][3], stoi(tokenArray[i][4]), stoi(tokenArray[i][5]), stoi(tokenArray[i][6]), stoi(tokenArray[i][7]), stuff);
我不断地单步执行代码并完成 add 方法的结束。当我到达 add 方法的末尾时,我发现一切看起来都很好。字符串和整数似乎都设置得很完美。在调试器运行后,我检查了以下行,发现一切看起来都很好。每个数组字段都有我期望的数据。(逻辑很糟糕,每个数组索引的数据都是相同的,但那是为了以后的故障排除会话:D)
myObjectArray[0] = &myObject;
add 方法运行后,执行被推迟到 main 方法,下面的代码将结果输出到屏幕:
cout << "TEST" << endl;
cout << mainClass->myObjectArray[0] << endl;
这就是问题所在.... mainClass->myObjectArray[0] 在所有字符串属性中都有空值,并且没有为它们输出任何内容(它们包含“”)....但是 int 属性对于某些具有正确的输出原因!
如果有人能深入了解为什么整数可用而字符串似乎不可用,我将永远感激不尽!
再次感谢!
解决方案
鉴于您确实没有发布所有代码,您发布的代码显示了一个主要问题,并且可能是您的程序行为如此的原因。
在您的MainClass::add()
函数中,您将局部变量的地址存储在MainClass::myObjectArray
数组中,并尝试从add()
函数外部访问这些地址。
代码概要:
int main()
{
MainClass* mainClass = new MainClass();
//...
mainClass->add(...);
//...
cout << mainClass->myObjectArray[0] << endl; // <-- index 0 points to a garbage value
}
void MainClass::add(string string1, string string2, string string3, string string4, int int1, int int2, int int3, int int4, Stuff stuff)
{
MyObject myObject;
if (stuff == STUFF2) {
MySubObject1 myObject; // <-- Local variable
//...
int* intArray[] = { &int2, &int3, &int4 }; // <-- Another local variable
//...
myObject.SetIntArray(intArray); // <-- Storing address of local
//...
myObjectArray[0] = &myObject; // <-- Storing address of local
//...
}
返回时add()
,这些地址将不会指向有效变量,因为这些变量不再有效,因为它们是局部变量。
因此,解决方法是您必须确保无论您在myObjectArray
数组中放置什么指针,所指向的这些变量的生命周期(范围)都将持续myObjectArray
.
使用存储“任何”值的类型数组的更好解决方案,例如std::any数组。
除此之外,您应该尝试减少对new
. 例如,您的main
函数一开始就走错了路:
int main()
{
MainClass* mainClass = new MainClass();
这可能只是:
int main()
{
MainClass mainClass;
推荐阅读
- wordpress - 如何将数据库文件恢复到 joomla 本地数据库?
- r - 总结 R 中两个表的值
- javascript - 动态加载未缓存的图像
- ios - 如何将表格行 ID 传递给下一个视图?
- string - 如何在 Scala 字符串中找到 Id 的出现
- javascript - 带有动态标题和单元格的 Angular 7 材料表
- msbuild - 当我使用 MSBuildWorkspace 进行构建时,是否有可以用来检测的属性
- c# - 在 ASP.NET MVC 中解码 HTML 字符代码
- c# - xamarin.android.support.compat 28.0.0.1 与 netstandard2.0 不兼容
- java - 为什么我用不同的账号登录后图片不显示?