Могу ли я передать умные указатели в качестве аргумента функции для генерации массивов вершин - PullRequest
0 голосов
/ 18 января 2020

Могу ли я передать уникальный указатель в качестве аргумента функции вместо необработанного указателя или массива

    unsigned int* m_VAO;
    m_VAO = (new unsigned int(totalNumberOfPies));
    glGenVertexArrays(totalNumberOfPies, m_VAO);

вместо того, чтобы m_VAO являлся необработанным указателем, может ли это быть интеллектуальным уникальным указателем?

Ответы [ 2 ]

1 голос
/ 18 января 2020

Могу ли я передать уникальный указатель в качестве аргумента функции вместо необработанного указателя [в функции OpenGL]

Нет. OpenGL определяется в терминах C -подобного языка, а реализации - это просто библиотеки, следующие за C ABI платформы. OpenGL использует только «сырые» указатели и вообще не может работать с объектами C ++.

Конечно, вы можете управлять указателями (и памятью, на которые они указывают) в объектах C ++, таких как интеллектуальные или уникальные указатели, ort std::vector или что угодно. И вы можете написать функции-оболочки для функций GL, которые напрямую могут работать с такими объектами, но на уровне OpenGL «сырые» указатели должны использоваться в любом случае.

или массив

Это на самом деле не так, как работает C / C ++. Использование имени массива в качестве выражения оценивает указатель на первый элемент этого массива, поэтому в любом случае передаются только необработанные указатели.

1 голос
/ 18 января 2020

Вы можете определить вас m_VAO как std::unique_ptr<GLuint[]>, и когда вы хотите передать указатель, управляемый интеллектуальным указателем, вы можете использовать get() для извлечения этого необработанного указателя.

std::unique_ptr<GLuint[]> m_VAO;

m_VAO = std::make_unique<GLuint[]>(totalNumberOfPies);

glGenVertexArrays(totalNumberOfPies, m_VAO.get());

A std::unique_ptr<GLuint[]> будет иметь смысл только в том случае, если вы также определите для него собственный деструктор, который вызывает соответствующую функцию OpenGL. Чтобы снова освободить массивы вершин. И даже в этом случае может возникнуть сомнение, если это правильный подход.

Кроме того, вы передаете умный указатель на функцию (или пишете функцию для принятия умного указателя), если эта функция собирается претендовать на владение либо напрямую, либо передайте его куда-нибудь, где заявлено право собственности.

Если вы этого не сделаете, тогда возникает вопрос, почему вы хотите использовать для этого умный указатель вместо std::vector:

std::vector<GLuint> m_VAO;

m_VAO.resize(totalNumberOfPies);

glGenVertexArrays(m_VAO.size(), m_VAO.data());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...