void* pointers get corrupted: D bug or misunderstanding?
Federico Santamorena
federico at santamorena.me
Sun Jul 28 18:54:48 UTC 2019
On Sunday, 28 July 2019 at 18:37:26 UTC, Dennis wrote:
> On Sunday, 28 July 2019 at 18:32:24 UTC, Federico Santamorena
> wrote:
>> So the problem I am noticing is very simple: as you may know
>> GTK callbacks have a void* user_data argument, what happens,
>> is that if the flow of code is this: D => C => D the void*
>> pointer when reaching the third step and finally emerging to
>> the D language will change its value and get corrupted.
>
> Can you give your exact callback function definition? I once
> had my context pointer corrupted because I marked my callback
> extern(C) instead of extern(Windows). Maybe you also have an
> error in your definition somewhere.
It's a bit complex but:
context is a pointer to a D struct
extern(C) void gtk_search_changed(GtkEditable* widget, void*
data) { //body }
context.search_input.g_signal_connect("changed",
>k_search_changed, context);
Then inside gtk_search_changed, startCrawling gets called and
context is just passed to it as the last argument:
DrillContext* startCrawling(in const(DrillConfig) config,
in immutable(string)
searchValue,
in immutable(void
function(immutable(FileInfo) result, void* userObject))
resultCallback,
in void* userObject) { //body }
And gets called like this:
startCrawling(drillConfig, searchString, &resultFound, context);
Then when the resultCallback gets called its userObject (that now
should be a pointer to context) is now corrupt:
void resultFound(immutable(FileInfo) result, void* userObject) {
//body}
And now inside resultFound the void* is completely corrupt
More information about the Digitalmars-d
mailing list