vector插入新对象
C++ Vectors insert new objects
我是一个自学成才的c++程序员(仍处于新手水平)。
我想我知道c++是如何工作的,但是我不明白这个:我想用自己定义的类的不同元素创建和填充std::vector:
// other code
while (getline(cfgDataStream, cfgData)) //parsing cycle of the config file
{
std::stringstream ss(cfgData); //creating a stream in order to fill fields
ss >> string1 >> IP1 >> IP2 >> PORT2 >> INDEX;
//they are all strings save the last one, which is a int
if (ss.fail())
{
//bad things happen
}
//FIRST IDEA: Using insert()
CModbusServer MBtemp* = new CModbusServer(this, IP2.c_str(), PORT2, INDEX)
std::vector<CModbusServer*>::iterator iterator = this->m_pServerCollection.begin(); //I get the vector initial position
m_pServerCollection.insert(iterator + (INDEX), MBTemp); // I put the new object in the right index (I don't trust the order in the config file)
//SECOND IDEA: Using push_back()
m_pServerCollection.push_back( new CModbusServer(this, IP2.c_str(), PORT2, INDEX)); //I attach each new object to the end of vector (i trust the order in the config file)
}
基本上我想创建一个CModbusServer的对象,并将其指针插入到一个向量中,这样我就有n个不同的CModbusServer对象在每个向量位置。这就是我迷路的地方,我尝试了两种插入方式(如代码所示),但没有成功。
CModbusServer有一个const char* ipAddress字段。如果我试图访问该字段(即在.Format(_T("%S))
函数中使用它),我得到随机数据。试着看看为什么我注意到在向量中我没有n个不同的对象,而是用new CModbusServer(this, IP2.c_str(), PORT2, INDEX)
创建的最后一个对象的n个副本。这可能是因为我有一个指针向量,但这些应该是指向不同对象的指针…
我使用Visual Studio 2015与MFC来实现一个基于对话框的应用程序。我有一个AppEngine类,它从其他类调用方法,并有一个CModbusServer元素的向量。CModbusServer.h如下:
class CModbusServer
{
public:
CModbusServer(void *parentEngine, const char* , unsigned short , int );
~CModbusServer();
const char* ipAddress;
unsigned short port;
int indNode;
modbus_t *MBserver;
bool isConnected;
}
那么,我的问题是:
1)为什么我不能访问ipAddress字段(而不是读取"192.0.2.1"我读取随机字符),而我理论上应该能够使用theApp.CModbusServerVector[properIndex]->ipAddress
读取它?
2)我在填充向量时犯了一个错误,但我看不出在哪里,最重要的是,为什么它是错误的。
感谢您的帮助,请原谅我的英语和任何遗漏。
编辑:CModbusServer的构造函数代码如下:
CModbusServer::CModbusServer(void *pE, const char* ip, unsigned short nport, int ind)
: parentEngine(pE), //used in order to keep track of the parent dialog
ipAddress(ip),
port(nport),
indNode(ind)
{
this->isConnected = false;
this->m_socket = INVALID_SOCKET;
memset(&m_socketstructhint, 0, sizeof m_socketstructhint);
m_socketstructhint.ai_family = AF_UNSPEC;
m_socketstructhint.ai_socktype = SOCK_STREAM;
m_socketstructhint.ai_protocol = IPPROTO_TCP;
MBserver = modbus_new_tcp(ipAddress, (int)nport);
}
如果我遗漏了其他有用的信息,请告诉我。
最初我使用CString
来管理字符串,但后来我发生了越来越多的问题,最后得到了一个编译和部分工作的代码与const char*
。我设法建立连接并读取所需的modbus寄存器,但随后我被困在isAddress打印问题上。
modbus_new_tc(ip,port)
是在libmodbus库中找到的方法,libmodbus库是一个为C编写的免费软件库,我必须使用它。
编辑2:与新答案相关:
所以,如果我是对的,我创建了一个临时的指针集,供构造函数使用(我现在已经添加了相关代码)。但是构造对象不应该和我传递的参数无关吗?这些论点没有被复制吗?如果这个问题很愚蠢,我很抱歉,但我仍在学习。
索引是顺序的,尽管在配置文件中它们也可以是0-1-2-3(每行1个)或0-3-1-2,这就是我所说的"不要相信它们"。
由于push_back
方法有相同的问题,可能问题又回到了构造函数中。让我感到困惑的是,通过一步一步地执行,我可以看到,随着while循环的每次迭代,我得到了新的和正确的数据,但不是放在第I个位置,而是放在第I个位置(即:原始数据:a b c,第一次运行向量= a;第二次运行向量= b b,第三次运行向量= c c c)
我不知道std::unique_ptr<>
,我去查一下。
我尝试使用std:string甚至CString,但问题在于libmodbus库之下。
在std::string
上调用c_str
将返回一个指向存储在该std::string
实例中的内部数据的"live"指针。返回的指针指向一个缓冲区,该缓冲区只有在调用它的std::string
仍然存在且未被修改的情况下才有效。
CExtracalModbusServer
的构造函数只存储传入的指针。只要在下一次输入循环中重新分配IP2
,该指针就会悬空。(指向的地址仍然是相同的,但是先前位于该地址的缓冲区要么被覆盖,要么被释放,或者其他什么。换句话说,指针只是悬空的)。
至于插入向量:第一种方法(使用insert
)只能在文件中的索引是顺序的并且从0
开始的情况下工作。您需要一个有效的vector迭代器来插入vector,这里的valid指的是指向vector中已经存在的一个元素,或者指向过尾迭代器(即由end()
返回的迭代器)。如果INDEX
等于或大于vector的大小,则m_pServerCollection.insert(iterator + (INDEX), MBTemp);
将尝试在vector之外插入(本质上是缓冲区溢出)。未定义的行为随之而来。
push_back
插入数据的方式应该可以工作,如果您看到它行为不正常,它要么是早期错误的产物(带有悬空指针的错误),要么是您没有显示的代码中存在单独的问题。
与手头的问题无关,但是代码中包含了手动管理动态内存的非常糟糕的做法。你应该使用std::unique_ptr<CModbusServer>
,而不是在vector中存储CModbusServer*
,并在所有正确的位置使用delete
手动管理内存,它将为你照顾适当的释放,即使在存在异常的情况下。
如果CModbusServer
在您的控制之下,您同样应该将其更改为存储std::string
而不是const char*
。除非必须与C风格的api交互,否则不要在c++中使用C风格的字符串,即使在这种情况下,也要将它们的使用限制在交互本身。这是同样的原则:不要手动管理内存。
- 尝试将对象插入空指针数组时出现分段错误
- 了解将对象插入矢量时的构造、复制和销毁
- 当类具有常量时,将对象插入到向量中
- 如何在声明时将对象插入 std::map
- 为什么我不能在 c++ 中将对象插入到地图中
- 使用带有比较结构的lower_bound将对象插入矢量
- 将没有默认 ctor 的对象插入到 std::map
- 如何将对象插入std::vector
- 将对象插入到具有动态内存(不允许向量)C++的数组中
- 将mpfr_t对象插入地图中的值
- C 将HEAP对象插入std ::用insert()插入映射,而另一个则存在删除新的对象
- C++将带有构造函数的对象插入到映射中
- 将对象插入到列表中
- 如何将对象插入到集合中
- 如何将用户定义的对象插入 STL 集
- 将具有const字段的对象插入到容器中
- 如何将自定义对象插入到std::map中
- 如何将 Parent* 对象(指向 &Child 对象)插入到向量中<Child>?
- 如何将vector中包含的对象插入到集合中
- 将对象插入到C++序列列表中