Nano Hash - криптовалюты, майнинг, программирование

Segfault при создании wxStringCollection в wxSQLite3

Я пишу приложение, использующее библиотеку wxSQLite3, которая представляет собой оболочку libsqlite3 для кроссплатформенной среды программирования с графическим интерфейсом wxWidgets. По какой-то причине вызов wxSQLite3Database::CreateStringCollection() приводит к segfault. (См. пример кода ниже.)

Чего я не понимаю, так это того, что при использовании wxIntegerCollection нет проблем; проблема возникает только при использовании wxStringCollection.

Библиотека wxSQLite3 скомпилирована с поддержкой именованных коллекций (согласно wxSQLite3Database::HasNamedCollectionSupport()). Эта проблема возникает в Windows/VC++8 и Linux/GCC.

//Sample code to illustrate problem
#include <wx/app.h>
#include <wx/arrstr.h>
#include <wx/wxsqlite3.h>

class Database {
    public:
        Database();
        ~Database() {db.Close();}
        void query(const wxArrayString& array);
    private:
        wxSQLite3Database db;
        wxSQLite3Statement strStmt;
        wxSQLite3StringCollection strCollection;
};

Database::Database() {
    db.Open(wxT(":memory:"));
    db.EnableForeignKeySupport(true);

    // Create and populate tables
    db.ExecuteUpdate(wxT("CREATE TABLE T1(id int primary key, val text);"));
    db.ExecuteUpdate(wxT("INSERT INTO T1 VALUES (1, 'one');"));
    db.ExecuteUpdate(wxT("INSERT INTO T1 VALUES (2, 'two');"));
    db.ExecuteUpdate(wxT("INSERT INTO T1 VALUES (3, 'three');"));
    db.ExecuteUpdate(wxT("INSERT INTO T1 VALUES (4, 'four');"));
    db.ExecuteUpdate(wxT("INSERT INTO T1 VALUES (5, 'five');"));
    db.ExecuteUpdate(wxT("INSERT INTO T1 VALUES (6, 'six');"));

    // Create the collection and statement
    strCollection = db.CreateStringCollection(wxT("valX_list")); //segfaults here
    strStmt = db.PrepareStatement(wxT("select * from T1 where val in valX_list;"));
}

void Database::query(const wxArrayString& array) {
    strStmt.Reset();
    strCollection.Bind(array);
    wxSQLite3ResultSet r_set = strStmt.ExecuteQuery();
    while (r_set.NextRow()) {
        wxPrintf(wxT("ID:%i  Val: %s\n"), 
            r_set.GetInt(wxT("id")),
            r_set.GetString(wxT("val")).c_str()
        );
    }
}

void runTest() {
    Database db;
    wxArrayString vals;
    vals.Add(wxT("two"));
    vals.Add(wxT("four"));
    vals.Add(wxT("six"));
    db.query(vals);
}

int main() {
    wxSQLite3Database::InitializeSQLite();
    runTest();
    wxSQLite3Database::ShutdownSQLite();
    return 0;
}

  • Как ваше приложение связывается с wxSQLite3, wxWidgets и стандартной библиотекой соответственно (статической или динамической/разделяемой)? Как они связаны между собой — wxSQLite3 с wx и стандартной библиотекой, wx со стандартной библиотекой? 30.01.2015
  • В Windows wxWidgets и wxSQLite3 являются статическими библиотеками, а в Linux они обе являются общими. 30.01.2015

Ответы:


1

В своем вопросе вы не указали, какую версию wxSQLite3 вы используете. К сожалению, в методе wxSQLite3StringCollection::operator= была ошибка, которая была исправлена ​​в последней версии wxSQLite3 3.2.0. Эта ошибка, скорее всего, вызывает segfault.

Если вы используете версию wxSQLite3 до 3.2.0, вам следует обновиться до версии 3.2.0.

29.01.2015
  • Большое спасибо! Обновление до 3.2.0 устранило проблему. Я использовал 3.1.1 в Windows и 3.0.6.1 в Linux (поскольку это версия в текущих репозиториях Ubuntu). 31.01.2015
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..