【问题标题】:Lisp, cffi, let and memoryLisp、cffi、let 和内存
【发布时间】:2013-07-09 01:35:09
【问题描述】:

我已经构建了一些玩具 C++ 库来从 Lisp 快速创建 Qt 窗口。我知道common-qt存在,我只是想学习如何使用cffi。

现在,我有 4 个绑定函数:

  • create-application : 创建一个 QApplication 并返回一个指针
  • create-window : 创建一个 QMainWindow 并返回一个指针
  • show : 显示指定为参数的窗口
  • exec : Qt 执行函数

这是一个完美运行的 lisp 代码:

(defctype t-app :pointer)
(defctype t-window :pointer)

(defcfun (create-application "create_application" ) t-app)
(defcfun (exec "exec") :void (app t-app))
(defcfun (create-window-aalt "create_window_aalt") t-window)
(defcfun (show "show") :void (o t-window))

(defparameter a (create-application))
(defparameter w (create-window-aalt))
(show w)
(exec a)

但如果我使用 LET 或 LET*...我有内存错误!

(let* ((a (create-application)) (w (create-window-aalt)))
    (show w)
    (exec a))


CORRUPTION WARNING in SBCL pid 1312(tid 140737353860992):
Memory fault at a556508 (pc=0x7ffff659b7f1, sp=0x7ffff2bbe688)
The integrity of this image is possibly compromised.
Exiting.

有人知道为什么吗?

我正在使用 SBCL:

env LD_LIBRARY_PATH=`pwd` \
env LD_PRELOAD=/usr/lib/libQtGui.so.4 \
sbcl --script aalt.lisp

谢谢。

【问题讨论】:

    标签: pointers lisp sbcl let cffi


    【解决方案1】:

    我建议您执行以下操作:

    1. 由于您正在编写库 C++ 并使用 Lisp 中的符号,因此请确保使用 extern "C" 声明 - 确保 C++ 编译器不会破坏名称。

    2. 检查您的库是否在 C(不是 C++)应用程序中工作。这将确保库本身正常工作(例如,它不会引发 C++ 异常)。

    UPD:

    我尝试运行您的代码并遇到了同样的崩溃。问题似乎出在您的 create_application 函数中。我已在http://paste.lisp.org/display/138049 附加了此函数的固定版本。

    具体有2个问题:

    1. create_application 在堆栈上分配了v。后续代码(即let 绑定)会覆盖它。

    2. argv 应该是NULL-终止的。即,它应该包含 argc+1 元素 - 最后一个元素为 NULL。 (Qt好像不用这个,但是按照规范写代码是个好习惯)。

    在您的情况下,堆栈分配是问题 - 似乎let 绑定覆盖了堆栈上v 的值,导致 SBCL 崩溃。使用mallocnew 在堆上分配argv 可以解决此问题。

    【讨论】:

    • 感谢您的回答!我已经使用了 extern "C",你可以在这里查看我的代码:pastebin.archlinux.fr/464826 好吧,如果我使用 defparameter 而不是 let,它可以在 Lisp 中工作,所以我想这不是 C++ 异常......但我会尝试无论如何,我会告诉你的。
    • 谢谢,它有效!但只有使用 Clisp,我仍然对 SBCL 有同样的错误。有什么线索吗?
    猜你喜欢
    • 1970-01-01
    • 2015-06-04
    • 2010-10-07
    • 1970-01-01
    • 1970-01-01
    • 2010-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多