десериализация структуры pod, хранящейся в файлах redis, если ключ определен как std :: string

Хранение структуры POD в Redis прекрасно работает с const char * но не если std::string вовлечен.

#include <hiredis/hiredis.h>
#include <string.h>
#include <string>
#include <iostream>

using namespace std;

struct Test
{
const uint32_t id;
const char *name;
};
int main() {
redisContext *context = redisConnect("127.0.0.1", 6379);
if (context == NULL || context->err) {
if (context) {
printf("Error: %s\n", context->errstr);
} else {
printf("Can't allocate redis context\n");
}
exit(EXIT_FAILURE);
}

Test obj = {(uint32_t) 123, "foo bar"};

const size_t size = 2 * sizeof(uint32_t) + (strlen(obj.name) + 1);

cout << "object{id: " << obj.id << ", name:' " << obj.name << "'}; size: " << size << endl;

redisReply *reply = 0;

const char *key = strdup("some-key");
reply = (redisReply *) redisCommand(context, "SET %b %b", key, strlen(key), &obj, size);

if (!reply)
return REDIS_ERR;

freeReplyObject(reply);

reply = (redisReply *) redisCommand(context, "GET %s", key);
if (!reply)
return REDIS_ERR;

Test *res = (struct Test*) reply->str;
cout << "result{id: " << res->id << ", name:' " << res->name << "'}; size: " << size << endl;

freeReplyObject(reply);
redisFree(context);
}

Если я заменю строки:

  const char *key = strdup("some-key");
reply = (redisReply *) redisCommand(context, "SET %b %b", key, strlen(key), &obj, size);

с

std::string key("some-key");
reply = (redisReply *) redisCommand(context, "SET %b %b", key.c_str(), key.size(), &obj, size);

исполнение всегда заканчивается Ошибка сегментации.

Я не могу решить проблему самостоятельно, и я был бы очень признателен за любую помощь.

0

Решение

Ладно, я понял:
замена второго redisCommand заявление

reply = (redisReply *) redisCommand(context, "GET %b", key.c_str(), key.size());

решил проблему.

-2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]