Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
JudFai
15 / 15 / 1
Регистрация: 05.04.2013
Сообщений: 94
Завершенные тесты: 1
#1

Обнуляются значения вектора

08.04.2015, 17:36. Просмотров 849. Ответов 9
Метки нет (Все метки)

Всем здравствуйте! Столкнулся с очень необычной проблемой, т.к. я до этого работал только на языках, где есть "сборщик мусора".

Есть некий класс, где содержится функция, которая возвращает вектор с динамическими значениями
C++
1
2
3
4
std::vector<char*> GetText()
{
    return _text;
};
Предположим мы в конструкторе инициализировали значения вектора _text(пусть будет _text[0] = "test"), но когда я пытаются обратиться к этой функции, то вдруг _text[0] имеет что-то вроде "TTTTTTTTTTTTTTTTTTTT" и т.д. То есть когда мы заходим в GetText, то значения вектора почему-то сбиваются. В чём может быть дело ?
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.04.2015, 17:36
Ответы с готовыми решениями:

Все элементы вектора обнуляются
Делал задачу. Надо в последовательности посчитать сумма между первым и...

Обнуляются поля в структуре
Всем привет! Курю книжку по плюсам от Шилдта. Домашнее задание было в книге...

переменная присваивает значения вектора
У меня есть определенные вектор, который содержит символы (причем в каждом ...

Просто не могу вывести значения из вектора
#include &lt;iostream&gt; #include &lt;vector&gt; #include &lt;stdexcept&gt; using...

Проверка, есть ли в ячейке вектора значения
if ( vec_all != 0) { for (int t = 0; t &lt; vec_all.size();...

9
aLarman
644 / 565 / 164
Регистрация: 13.12.2012
Сообщений: 2,112
Завершенные тесты: 1
08.04.2015, 17:38 #2
в том что лучше использовать vector<string>
и возвращать константной ссылкой а не копией

Добавлено через 56 секунд
Цитата Сообщение от JudFai Посмотреть сообщение
инициализировали значения вектора _text
push_back надо делать, а не "инициализировать" подобным образом
0
JudFai
15 / 15 / 1
Регистрация: 05.04.2013
Сообщений: 94
Завершенные тесты: 1
09.04.2015, 18:57  [ТС] #3
aLarman, вообще мне было бы желательно использовать char*, всё-таки так настояли. И плюс ко всему я немного оговорился, я использую Insert
0
retmas
Жарю без масла
865 / 747 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
09.04.2015, 19:14 #4
Цитата Сообщение от JudFai Посмотреть сообщение
я использую Insert
ну, если используете insert таким способом
C++
1
_text.insert(iter, "blablabla");
то и ожидайте в лучшем случае
Цитата Сообщение от JudFai Посмотреть сообщение
что-то вроде "TTTTTTTTTTTTTTTTTTTT"
память под строки нужно выделять, раз не используете string
0
aLarman
644 / 565 / 164
Регистрация: 13.12.2012
Сообщений: 2,112
Завершенные тесты: 1
09.04.2015, 21:11 #5
Цитата Сообщение от retmas Посмотреть сообщение
то и ожидайте
Да ладно, строковый литерал не закорраптится, пока не попробуешь его изменить
0
retmas
Жарю без масла
865 / 747 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
09.04.2015, 21:36 #6
Цитата Сообщение от aLarman Посмотреть сообщение
Да ладно, строковый литерал не закорраптится, пока не попробуешь его изменить
ок. видимо я плохо выразил свою мысль.
за неимение кода, я не знаю, что тс делает со своим классом и его данными. соответственно я предполагаю, что данные там как обрабатываются, в т.ч. и меняются. за неимением инфы я предполагаю худшее
0
JudFai
15 / 15 / 1
Регистрация: 05.04.2013
Сообщений: 94
Завершенные тесты: 1
09.04.2015, 21:43  [ТС] #7
retmas, ну попробовал я push_back. но ничего это не дало
0
Zazy
45 / 45 / 23
Регистрация: 14.04.2013
Сообщений: 186
09.04.2015, 21:46 #8
JudFai, код покажите
0
JudFai
15 / 15 / 1
Регистрация: 05.04.2013
Сообщений: 94
Завершенные тесты: 1
09.04.2015, 22:50  [ТС] #9
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
Class Test
{
    private:
        std::vector<char*> _feat;
        Test(){}
    public:
        static Test* Create()
        {
            Test* test = new Test();
            char feat[31] = "test";
            char* string;
 
            string = strtok(feat, "/");
            while (string != NULL)
            {
                test ->_feat.push_back(string);
                string = strtok(NULL, "/");
            }
 
            return test;
        }
        
        std::vector<char*> GetFeat()
        {
            return _feat;
        }
};
 
void main(void)
{
    Test* test = Test::Create();
    for (int i = 0; i < test ->GetFeat().size(); i++)
        printf("\t%s\n", mp3->GetFeat()[i]);
}
В тот момент, когда мы пытаемся обратиться к функции GetFeat(), то поле _feat обнуляется.
0
Zazy
45 / 45 / 23
Регистрация: 14.04.2013
Сообщений: 186
10.04.2015, 00:21 #10
Лучший ответ Сообщение было отмечено JudFai как решение

Решение

JudFai, string ссылается на feat, feat - локальная переменная после завершения метода она "умирает" и string ссылается неизвестно на что.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
class Test
{
private:
    std::vector<char*> _feat;
    Test(){}
public:
    static Test* Create()
    {
        Test* test = new Test();
        char feat[31] = "test";
        char* string = nullptr;
        string = strtok(feat, "/");
        while (string != nullptr)
        {
            char *tmp = new char[strlen(string) + 1];
            strcpy(tmp, string);
            test->_feat.push_back(tmp);
            string = strtok(nullptr, "/");
        }
        return test;
    }
 
    std::vector<char*>  GetFeat()
    {
        return _feat;
    }
};
 
void main(void)
{
    Test* test = Test::Create();
    for (const auto &x : test->GetFeat())
    {
        std::cout << x << std::endl;
    }
    for (int i = 0; i < test->GetFeat().size(); i++)
        delete test->GetFeat()[i];
    system("pause");
}
1
10.04.2015, 00:21
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.04.2015, 00:21

список (в программе обнуляются указатели на структуры)
здравствуйте помогите найти ошибку, при возврате указателя на структуру из...

Вычислить значения элементов вектора по заданной формуле
Найти вектор y={y1,y2…,y6} по формуле: yi={5xi3-3xi2+1 если i&lt;3, ...

Исправить программу на собственные значения и им соответствующие вектора
Ребята вот смотрите: программа в принципе работает правильно (считает...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru