Рассмотрим пример кода игрушки ниже. Он имеет слишком большую для копирования структуру данных MyDataStructure и небольшой класс итератора MyDataIterator, экземпляр которого вызывающая сторона может создать для перебора данных в структуре.
В игрушечной версии кода структура данных содержит всего 10 целых чисел (1000–1009), и раздел WORKING CODE в main() корректно перебирает их, как и ожидалось. >
Однако второй (BROKEN CODEРаздел ) в main() обрабатывает их неправильно; он вызывает неопределенное поведение, поскольку вызывает GetDataStructureByValue() вместо GetDataStructureByReference(), что означает, что ссылка MyDataStructure, которую iter сохраняет в своем частном члене _ds -variable становится висячей ссылкой перед первой итерацией цикла.
Это немного коварная проблема, потому что в неигрочном коде не всегда легко узнать/запомнить по имени функции, возвращает ли она по значению или по ссылке, но первый случай приводит к неочевидной ошибке во время выполнения, а второй случай работает нормально.
Мой вопрос: Есть ли какой-нибудь разумный способ заставить современный компилятор C++ выдавать ошибку или хотя бы предупредить о проблемном случае? Я подозреваю, что нет, но я все равно спрашиваю, потому что я чувствовал бы себя в большей безопасности, если бы случаи этой проблемы могли каким-то образом автоматически отмечаться для меня.
Исходный код игрушки Ниже приведена программа, за которой следует пример ее вывода на моем Mac с XCode:
#include
class MyDataStructure
{
public:
MyDataStructure()
{
printf("MyDataStructure CTOR %p\n", this);
for (int i=0; i
Подробнее здесь: https://stackoverflow.com/questions/790 ... this-objec
Есть ли способ заставить компилятор C++ обнаруживать и предупреждать/ошибать об этой ошибке времени жизни объекта? ⇐ C++
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Как заставить компилятор предупреждать, что это недопустимый логический тип?
Anonymous » » в форуме C++ - 0 Ответы
- 27 Просмотры
-
Последнее сообщение Anonymous
-