Проблема с переводом char * в вектор, но после каждой итерации добавление указателя на буфер с одинаковыми значениями в вектор [решено] - PullRequest
2 голосов
/ 18 июня 2019

[решено] Я изменил переменные типа char на массив std::string, где я помещаю переменные типа float в массив.После всего этого вы можете преобразовать std::string в const char*

Я делаю клиента на сервере.И я хочу отправить данные на сервер, но когда я запускаю этот код, я получаю 4,5 дважды вместо 180 и 4,5.Я использую символы, потому что функция отправки, которую я использую, поддерживает только символы.

Очистка символа (не работает) Печатает значение до завершения оператора if (Это показывает, что значение правильное),но когда цикл for повторяется во второй раз, он равен 4,5 вместо 180.

float an = 180;
float dis = 4.5;

for (int i = 0; i < 1; i++) {
    set.measurements.push_back(an); 
    set.measurements.push_back(dis);
}

for (int i = 0; i < set.measurements.size(); i++){
    sprintf(values, "%0.1f", set.measurements[i]);
    if (i == 1 && i != 0){
         std::cout << "{ 4.5 }" << '\n'; // expected output
         char *dist = new char[10];
         dist = values; // <-- Value is 4.5
         meas.push_back(dist); 
         // This is 4.5 but the angle doesn't stay 180
         delete dist;
    }
    if (i == 0 && i != 1){
        std::cout << "{ 180 }" << '\n'; // Expected output
        char *ang = new char[10];
        ang = values; // <-- Value is 180 here
        meas.push_back(ang); 
        delete ang;
    }
}

for (int i = 0; i < 2; i++) {
  std::cout << &*meas[0] << '\n';
}

Я ожидаю, что выходной сигнал будет 180 и 4,5, но фактический выходной сигнал равен 4,5 и 4,5

1 Ответ

3 голосов
/ 18 июня 2019
char *dist = new char[10];

Это выделяет новый массив char и устанавливает dist для указания на него.

dist = values; // <-- Value is 4.5

Следующая строка немедленно заменяет указатель dist на new -Эд буфер, утечка этой памяти.Это теперь устанавливает dist, чтобы указывать на некоторый другой буфер (предположительно), вместо этого.

meas.push_back(dist); 

Это теперь добавляет указатель на объект values в вектор.Поэтому каждая итерация цикла заканчивается добавлением указателя на тот же самый буфер values в вектор, и это то, что вы видите в конце.

delete dist;

Это все еще указывает наvalues.Исходя из контекста, маловероятно, что values изначально был создан с new, и даже если бы это было так, каждая итерация цикла заканчивалась бы delete одним и тем же указателем.В любом случае, это неопределенное поведение, и при достаточном количестве циклов ваша программа, скорее всего, будет аварийно завершена.

Второй оператор if повторяет все вышеперечисленные ошибки.

Поскольку ваше намерениепо-видимому, для написания кода на C ++ вам действительно нужно использовать библиотеку C ++, а именно отформатированные операторы вывода, и std::string s, которые будут правильно распределять и управлять всей памятью для вас, устраняя такие общие логические ошибки.

...