首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Lisp,cffi,let和内存

Lisp,cffi,let和内存
EN

Stack Overflow用户
提问于 2013-07-10 22:43:46
回答 1查看 795关注 0票数 6

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

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

  • 创建-应用程序:创建一个QApplication并返回一个指针
  • 创建窗口:创建一个QMainWindow并返回一个切入点
  • 显示:显示指定为参数的窗口
  • Qt功能

下面是一个完美工作的lisp代码:

代码语言:javascript
复制
(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*.我有记忆错误!

代码语言:javascript
复制
(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:

代码语言:javascript
复制
env LD_LIBRARY_PATH=`pwd` \
env LD_PRELOAD=/usr/lib/libQtGui.so.4 \
sbcl --script aalt.lisp

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-07-13 07:08:32

我建议你做以下几点:

  1. 由于您正在编写库C++并使用其来自Lisp的符号,请确保使用extern "C"声明--这些声明是确保C++编译器不会损坏名称所必需的。
  2. 检查您的库是否在C(而不是C++)应用程序中工作。这将确保库本身正常工作(例如,它不会引发C++异常)。

UPD:

我试过运行您的代码,也发生了同样的崩溃。问题似乎在您的create_application函数中。我已经在http://paste.lisp.org/display/138049上附加了这个函数的固定版本。

具体而言,有两个问题:

  1. create_application在堆栈上分配了v。后续代码(即let绑定)覆盖它。
  2. argv应该是NULL-terminated。也就是说,它应该包含argc+1元素--最后一个元素是NULL。(Qt似乎不使用这个,但是根据规范编写代码是个好习惯)。

在您的示例中,堆栈分配是一个问题-- let绑定似乎覆盖了堆栈上的v值,从而使SBCL崩溃。使用mallocnew在堆上分配argv解决了这个问题。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17582216

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档