Это решение, которое работает для меня.
Я использовал , получил вместо 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
, если хотите выполнить асинхронный способ.
Кажется, это правильно. Boost's shared_ptr является указателем подсчета ссылок. Счетчик ссылок может восстановить память, если между объектами нет циклических ссылок. В вашем случае объекты класса A не ссылаются ни на какие другие объекты. Таким образом, вы можете использовать shared_ptr без забот. Кроме того, семантика владения позволяет использовать shared_ptr в контейнерах STL (и Qt).
Если вы не используете умный указатель, вы должны удалить элементы списка самостоятельно.
Источник:
#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
Не хорошо.
Этот код выглядит отлично.
Если вы ищете совет, возможно, вы могли бы предоставить больше информации о цели использования shared_ptr с QList, может быть способ "Qt" сделать это без вытягивания больших пушек, таких как shared_ptr.
Трудно что-либо предложить, не зная, почему список объектов 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()