Есть ли способ заставить компилятор C++ обнаруживать и предупреждать/ошибать об этой ошибке времени жизни объекта?C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Есть ли способ заставить компилятор C++ обнаруживать и предупреждать/ошибать об этой ошибке времени жизни объекта?

Сообщение Anonymous »

Рассмотрим пример кода игрушки ниже. Он имеет слишком большую для копирования структуру данных 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»