Указатель на элементы std :: вектор через std :: ecector.data () указывает на коррумпированные данныеC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Указатель на элементы std :: вектор через std :: ecector.data () указывает на коррумпированные данные

Сообщение Anonymous »

Наукатическое редактирование: Этот вопрос вместо этого о std :: вектор (определенный внутри функции), который вышел из области, но указатель на его первый элемент был возвращен через std :: ecector.data (). Попытка использовать данные, указанные возвращенным указателем, в конечном итоге в конечном итоге в поврежденных данных, поскольку данные внутри std :: вектор уже вышли из строя и освобождены. Например ,:

Код: Выделить всё

...
type *ptr;
type* function1(){
std::vector vector;
return vector.data();
}
ptr = function1();
// ptr points to corrupt data here
...
Решение на Topic: « способ », написанное ниже, является решением, но он на мгновение дублирует данные. Еще одна вещь, которую можно было бы сделать, например:

Код: Выделить всё

...
std::vector vect;
void function1(std::vector &vector){
// Add data to vector
}
// Use the data inside vector
type *ptr = vect.data();
...
Старый вопрос ...
Контекст контекста : я пишу этот двигатель, где я храню позицию, нормальную, вершину и индексы в классе сетки. Я использую динамические массивы необходимых типов OpenGL, точно так же: < /p>

Код: Выделить всё

class Mesh(){
...
GLfloat *vertices;
GLubyte *indices;
...
}
< /code>
Я разработал куб с ручкой и бумагой, с его вершинами, координатами текстуры, нормами и индексами, а затем заполнил мои динамические массивы этими данными (скопировал их вручную :: Скопируйте его в динамические массивы после правильного распределения памяти (используя новый BTW). Это работало как чар....
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
...
glVertexPointer(3, GL_FLOAT, 0, meshInst->pos_coords);
glTexCoordPointer(2, GL_FLOAT, 0, meshInst->tex_coords);
...
glDrawElements(
GL_TRIANGLES, (CORRECT index count), GL_UNSIGNED_BYTE,
meshInst->indices
);
...
THE CONTEXT:
I created another constructor for Mesh, which instead of copying the data to newly allocated memory from an array of GLfloat, GLubyte, etc. (which worked like a charm I might repeat), it does the following:

1)Loads data (which was Тщательно протестированные для правильного импорта ) из файла в std :: vector положения , std :: vector ind и т. Д.

2) Я попробовал два способа передачи данных в мои динамические массивы, чтобы быть выброшенными на OpenGL, способ и путь b:





способ a: < /strong> < /p>

Код: Выделить всё

std::copy(positions.begin(), positions.end(), vertices);
std::copy(inds.begin(), inds.end(), indices);
< /code>
 Результат: < /strong> работает отлично, как в первом конструкторе

 print: < /strong> < /p>
P[72] = { 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1 }
I[36] = { 0, 1, 2, 3, 2, 1, 6, 4, 7, 5, 7, 4, 10, 8, 9, 11, 9, 8, 13, 12, 15, 14, 15, 12, 17, 16, 19, 18, 19, 16, 23, 20, 21, 22, 21, 20 }
< /code>

 way b: < /strong> < /p>
vertices = positions.data();
indices = inds.data();
Результат: ничего не нарисованоP[72] = { 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1 }
I[36] = { 0, 1, 2, 3, 2, 1, 6, 4, 7, 5, 7, 4, 10, 8, 9, 11, 9, 8, 13, 12, 15, 14, 15, 12, 17, 16, 19, 18, 19, 16, 23, 20, 21, 22, 21, 20 }
< /code>

Вопрос в том ... почему? Как указано в http://www.cplusplus.com/reference/vector/vector/data/. Кроме того, если я сравню данные, указанные «вершинами» и «индексами», это буквально идентично. Сравните оба отпечатки данных для себя. Они оба напечатаны с использованием хранимой длины и динамическими указателями массива сразу после загрузки.>

Подробнее здесь: https://stackoverflow.com/questions/363 ... -corrupt-d
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Эквивалентность между std :: ecector > и std :: ecector
    Anonymous » » в форуме C++
    0 Ответы
    16 Просмотры
    Последнее сообщение Anonymous
  • Эквивалентность между std :: ecector > и std :: ecector
    Anonymous » » в форуме C++
    0 Ответы
    9 Просмотры
    Последнее сообщение Anonymous
  • Эквивалентность между std :: ecector > и std :: ecector
    Anonymous » » в форуме C++
    0 Ответы
    9 Просмотры
    Последнее сообщение Anonymous
  • Эквивалентность между std :: ecector > и std :: ecector
    Anonymous » » в форуме C++
    0 Ответы
    7 Просмотры
    Последнее сообщение Anonymous
  • Как исправить коррумпированные символы, такие как «», «», «» в файле JSON? [закрыто]
    Anonymous » » в форуме Python
    0 Ответы
    3 Просмотры
    Последнее сообщение Anonymous

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