QList и shared_ptr

Это решение, которое работает для меня.

Я использовал , получил вместо axios , потому что я не могу заставить его работать там.

Я установил параметры запроса:

const requestOptions = {
    encoding: null, // this is important
    headers: {
        "Accept-Encoding": "gzip",
    }
    ...
};

Не забудьте эту строку encoding: null, потому что без этого ответ будет автоматически преобразован в строку. (Нам нужен буфер для этой работы)

Затем я создал такую ​​функцию для обработки моего запроса:

const zlib = require("zlib");

async function performRequest(url, options) {
    try {
        const response = await got(url, options);
        if (response.headers["content-encoding"] === "gzip") {
            const body = response.body;
            try {
                const dezziped = zlib.gunzipSync(response.body);
                response.body = JSON.parse(dezziped.toString());
            } catch (error) {
                response.body = body;
            }
        }
        return response.body;
    } catch (error) {
        return error;
    }
}

Примечание: Это синхронная операция вместо этого вы можете использовать gunzip, если хотите выполнить асинхронный способ.

5
задан demonplus 20 December 2016 в 05:58
поделиться

4 ответа

Кажется, это правильно. Boost's shared_ptr является указателем подсчета ссылок. Счетчик ссылок может восстановить память, если между объектами нет циклических ссылок. В вашем случае объекты класса A не ссылаются ни на какие другие объекты. Таким образом, вы можете использовать shared_ptr без забот. Кроме того, семантика владения позволяет использовать shared_ptr в контейнерах STL (и Qt).

1
ответ дан 15 December 2019 в 01:10
поделиться

Если вы не используете умный указатель, вы должны удалить элементы списка самостоятельно.

Источник:

#include <QList.h>
#include <boost/shared_ptr.hpp>
#include <iostream>

class A {
private:
    int m_data;
public:
    A(int value=0) { m_data = value; }
    ~A() { std::cout << "destroying A(" << m_data << ")" << std::endl; }
    operator int() const { return m_data; }
};

int _tmain(int argc, _TCHAR* argv[])
{
    QList<A *> list;
    list.append(new A(6));
    std::cout << int(*(list.at(0))) << std::endl;
    return 0;
}

Вывод:

6

Не хорошо.

1
ответ дан 15 December 2019 в 01:10
поделиться

Этот код выглядит отлично.

Если вы ищете совет, возможно, вы могли бы предоставить больше информации о цели использования shared_ptr с QList, может быть способ "Qt" сделать это без вытягивания больших пушек, таких как shared_ptr.

1
ответ дан 15 December 2019 в 01:10
поделиться

Трудно что-либо предложить, не зная, почему список объектов shared_ptr из A существует в первую очередь.

Возьмите посмотрите на семантику владения умных указателей. Может быть, вам поможет.

Некоторые другие вещи, которые можно улучшить:

1. Используйте списки инициализаторов в ctor, например:

class A {
 private:
   int m_data;
 public:
    A(int value=0) : m_data (value) {}
 // ....

2. int _tmain (int argc, _TCHAR * argv []) не является стандартной подписью;

Используйте

int main(int argc, char* argv[])

или просто:

int main()
1
ответ дан 15 December 2019 в 01:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: