Что может привести к потере объекта на другом конце указателя в c ++? - PullRequest
1 голос
/ 01 декабря 2009

РЕДАКТИРОВАТЬ: Я обнаружил ошибку: я не инициализировал массив с размером. вопрос можно закрыть.


У меня есть класс V, а другой класс N. Объект N будет иметь массив указателей на объекты класса V (скажем, V **vList). Итак, N имеет такую ​​функцию, как V **getList(); Теперь в какой-то функции других классов или просто в функции драйвера, если я скажу, что V **theList = (N)n.getList(); Q1: theList будет указывать на 1-й элемент массива? Учитывая, что размер массива известен, могу ли я выполнить цикл с индексом i и сказать V *oneV = *vList[i]? Пожалуйста, поправьте меня, если то, что я делаю выше, неправильно.


Я использовал отладчик для отслеживания всего процесса выполнения моей программы, но обнаружил, что после использования V *oneV = vList[i] значения указателей в массиве vList были такими же, как когда они были созданы, но если я следую за указателем туда, куда он указывает, объект исчез. Я предполагаю, что это может быть причиной того, что я получаю ошибку сегмента или ошибку шины. Может ли это быть так? ПОЧЕМУ я «потерял» объект на другом конце указателя? Что я сделал не так?


и да, я работаю над школьным заданием, поэтому я не хочу распечатывать свои коды, я хочу закончить это сам, но мне нужна помощь в поиске проблемы. Я думаю, что мне все еще нужно объяснение по массиву указателей. Спасибо

Ответы [ 4 ]

1 голос
/ 01 декабря 2009

Q1 правильно. Для второй части V *oneV = vList[i] будет правильным синтаксисом. В вашем синтаксисе вы разыменовываете еще раз (рассматриваете объект типа V как указатель на такой объект), что, очевидно, приводит к сбою вашего кода.

EDIT: Поскольку вы используете правильный синтаксис, причина ошибок может зависеть от управления вашей памятью объектов типа V. Если вы вставили адреса объектов, созданных в стеке (автоматические переменные, а не new или malloc) внутри функции, и пытаетесь получить к ним доступ вне ее, то указатели будут зависать, и ваш код будет падать.

0 голосов
/ 01 декабря 2009

Сначала исключите начальные:

  • вы правильно инициализируете (новые вместо автоматических / локальных переменных)
  • вы обращаетесь к элементам правильно (не так, как в опечатке, которую вы разместили в вопросе - на основе вашего комментария)
  • вы используете правильный размер

Если вы пройдете все обычные и все k, то обязательно обратите особое внимание на ваши циклы / вычисления размера / и все остальное, что может заставить вас писать по непредусмотренным адресам.

Можно написать мусор в непредусмотренных местах, а затем получить ошибку в неожиданных местах ... Самое худшее, что я видел, это повреждение некоторых дескрипторов файлов из-за неправильной работы массива перед этими переменными - он сломался на связанные с файлом функции, которые казались v. сумасшедшим.

0 голосов
/ 01 декабря 2009

theList будет указывать на 1-й элемент массива? Учитывая, что размер массива известен, могу ли я зациклить через с индексом я и сказать V * oneV = * Vlist [я]

Да, это правильно.

Я предполагаю, что это может быть причиной почему я получаю ошибки или автобус ошибка. Может ли это быть дело?

Да, если у вас неверный указатель и вы попытаетесь разыменовать его, вы получите ошибку сегмента.

ПОЧЕМУ я «потерял» объект на другой конец указателя? Что я делал неправильно?

Это трудно предсказать, не видя реального кода. Наиболее вероятные причины: либо вы неправильно заполняете V**, либо после помещения указателя V * в массив V** вы удаляете этот объект из какого-то другого места. Кстати, я предполагаю, что вы выделяете память, используя new, верно ли это предположение?

0 голосов
/ 01 декабря 2009

Класс N должен как-то управлять количеством элементов в списке. Обычные подходы состоят в том, чтобы сделать публичную функцию, которая возвращает количество элементов в массиве, или предоставить функцию итератора, которая перебирает все элементы списка.


Массив с N элементами хранится в массиве [0] через массив [N-1]. Вы обращаетесь к одному за концом массива.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...