Документация для json_object_new_object гласит
Помните, что при использовании json_object_object_add или json_object_array_put_idx право собственности переходит к объекту / массиву.
blockquote>и
Любые владения, которые вы приобрели, но не передали, должны быть переданы через json_object_put.
blockquote>Для меня это означает, что все должно быть в порядке:
json_object *jobj1 = json_object_new_object(); json_object *jobj2 = json_object_new_object(); json_object_object_add(jobj1, "Object", jobj2); // ... json_object_put(jobj1); // This is the only one we have ownership of now
И да, как сказано в документации, вы должны освободить все свои права владения, используя
json_object_put
,Что касается json_tokener_parse , в документации явно ничего не говорится о владении или освобождении, но я был бы очень удивлен, если бы он был другим
json_object_new_object
в этом отношении , Это не имело бы никакого смысла, если бы вам не разрешили использовать объекты, возвращенные изjson_tokener_parse
, так же, как вы можете использовать объекты, построенные черезjson_object_new_object
.Например, должно быть возможно сделать это:
json_object *jobj1 = json_object_new_object(); // "Manual" object json_object *jobj2 = json_tokener_parse(...); // Parsed object // At this point, jobj1->_ref_count and jobj2->_ref_count will both be 1. // We could now add the parsed object as a new field in our "manual" one: json_object_object_add(jobj1, "ParsedObject", jobj2); // ... // In the end, we only have to release the "manual" object. json_object_put(jobj1);
Также, да, как показывает ваш журнал valgrind, функция
json_tokener_parse
вызываетjson_object_new_object
за кулисами, поэтому вам нужно вызовитеjson_object_put
для возвращенного объекта (т.е., если вы не включите его в другой объект или массив, как упоминалось ранее).Парню, который написал код в упомянутом посте в блоге , похоже, не небезразлична утечка памяти в его программе, возможно, потому, что эта программа настолько проста и заканчивается сразу после обработки только одного объекта.
string1> = string2 не поддерживается в C# Linq К Sql. Строковый класс не переопределяет> = оператор вообще. Это только переопределяет! = и == операторы. Можно проверить это путем попытки скомпилировать следующий метод
public static void Example() {
int val = "foo" >= "bar";
}
Если Вы хотите выдержать сравнение со Строками в LinqToSql, необходимо смочь использовать статическую Строку. Сравните (строка, строка) метод.
Если Вы ищете =>
который обычно писался бы как >=
затем Вы не можете сделать этого непосредственно со строками. Можно получить то же поведение через CompareTo:
string1.CompareTo(string2) >= 0
В этом случае, причем результат меньше чем или равен для обнуления средств это string1
был бы отсортирован прежде string2
и поэтому больше.
К вашему сведению =>
оператор в C# используется только в определении лямбда-выражений.
Я не совсем уверен, что =>, чем или о каком языке Вы говорите, но я могу только предположить, что Вы обращаетесь к> = (больше, чем или равные). Вы не можете использовать большее, чем или равняться оператору со строками, потому что нет категорического способа сказать то, о чем Вы говорите. Если они - на самом деле числа, можно хотеть сделать.
var query = from c in dc.Customers
where c.CustomerID >= Int32.Parse("32")
select c;
Я не абсолютно уверен, что Вы пытаетесь сделать здесь, но строки непосредственно переводят в Linq к SQL-запросам.
Вы могли дать пример того, чего Вы делаете попытку?
Вот основное использование в качестве примера:
string string2 = "test";
using (MyDataContext dc = new MyDataContext())
{
// without lambdas
var query1 = from item in dc.Items
where item.Value == string2
select item;
// with lambdas
var query2 = dc.Items.Where(item=>item.string1 == string2);
}