C ++ NULL-указатель в контейнере STL - PullRequest
0 голосов
/ 15 января 2010

Я, к сожалению, не работаю над программой, разработанной мной полностью. Недавно я заметил фатальную ошибку Visual Studio для оператора - unordered_set, которая была вызвана простой вставкой указателя на unordered_set. Изучив местных жителей, я заметил, что в наборе есть только 2 элемента, последний из которых равен NULL (так что, я полагаю, это то, на чем он упал). Теперь к вопросу: как (теоретически) unordered_set (или любой другой контейнер STL) может получить указатель NULL в качестве одного из своих элементов. Программа многопоточная, но, по моим отзывам, доступ к этой части кода возможен только из одного потока. Спасибо.

Стек вызовов и части исходного кода для тех, кому интересно: http://privatepaste.com/c8e7f35a4e (PushToProcessed вызывается из самого объекта, он передает ссылку на себя, поэтому не может быть NULL)

Ответы [ 3 ]

6 голосов
/ 15 января 2010

Наборы могут содержать указатели, которые могут быть NULL.

#include <iostream>
#include <vector>

int main () {
    std::vector<int *> foo;
    foo.push_back (NULL);
    std::cout << foo.size () << std::endl;
    return 0;
}

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

4 голосов
/ 15 января 2010

NULL - это совершенно правильное значение указателя. Если передается значение NULL, оно будет обрабатываться как любой адрес памяти. Поскольку вы видите только 2 записи, я бы поспорил, что на самом деле вы видите, что многие NULL-указатели «добавляются» в ваш набор, но поскольку это набор, сохраняется только одна копия.

Edit:

Чтобы проверить мою гипотезу о том, что для многих элементов добавляется все значение NULL, почему бы не ввести простой вызов cout, в котором указано «Новый элемент добавлен с address =» значением указателя. Спорим, ты удивишься.

1 голос
/ 15 января 2010

Я полагаю, что значение указателя контейнера может быть установлено через неконстантный итератор с разыменовкой, как в (* iter) = NULL. Это, конечно, будет плохо .

...