Хранение указателя на символ в контейнере - PullRequest
0 голосов
/ 26 августа 2018

Я пытаюсь сохранить char*, который регулярно обновляется.

мне нужно хранить данные, на которые он указывает, на контейнер в c ++

я пытался использовать char* vector , но все элементы указывают на последнее обновление char*.

Вот мой код:

std::vector<const char*>Packets;
char* Packet;
void __declspec (naked) RecvCaller()
{
    __asm mov ecx, [ebp + 0x08]
    __asm mov Packet, ecx
    Packets.push_back(Packet);
    __asm jmp dwJmpBack
}

Как мне этого добиться?

Ответы [ 2 ]

0 голосов
/ 26 августа 2018

Вы можете вставить символ * в вектор.Возможно, вы меняете значение Packet в другом коде?Вот простой пример.

#include <iostream>
#include <vector>


int main(int argc, char* argv[])
{
   char * ptr;

   char a[] = "first";
   char b[] = "second";
   char c[] = "third";


   std::vector<char const *> v;
   ptr = a;
   v.push_back(ptr);
   ptr = b;
   v.push_back(ptr);
   ptr = c;
   v.push_back(ptr);
   for(auto const & element:v)
   {
    std::cout << element << std::endl;
   }
}

Если последующий код изменится a, b или c, то, конечно, сохраненный символ * будет отражать это изменение.

Как заметил @ravenspoint, возможно, вы хотите сделать полную копию Пакета и сохранить ее в векторе вместо указателя.

0 голосов
/ 26 августа 2018

Я не думаю, что вы хотите сохранить указатель на пакет, скорее вы хотите сохранить сам пакет.

Итак, вам нужно создать вектор пакетов, создать новый элемент вектора и скопировать данные, на которые он указывает, в элемент вектора.

Итак, предположим, что у вас есть класс cPacket с конструктором, который принимает указатель на символ, тогда вы можете написать

class cPacket {
public:
cPacket( char* p )
{
// code to copy the data into attributes
...
}
};


std:vector< cPacket > vPacket;

...

vPacket.push_back( cPacket( Packet ) );

В качестве альтернативы, если остальная часть вашего кода ожидает вектор указателей

std::vector< cPacket* > vpPacket;

...

vpPacket.push_back( new cPacket( Packet ) );
...