我是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属性具有适当的值输出出于某种原因!
如果任何人对为什么可以使用int以及字符串似乎不存在有任何见解,我将永远感激不已!
再次感谢!
答案 0 :(得分:0)
鉴于您确实没有发布所有代码,所以您发布的代码显示了一个主要问题,并且可能是程序行为与原来相同的原因。
在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
。 / p>
使用存储“任意”值的类型的数组(例如std::any数组)的更好解决方案。
除此之外,您应该尝试减少对new
的不必要的调用。例如,您的main
函数从错误的脚开始:
int main()
{
MainClass* mainClass = new MainClass();
这本来可以是:
int main()
{
MainClass mainClass;