gpt4 book ai didi

c - Ruby C gem 运行之间的内存污染

转载 作者:行者123 更新时间:2023-11-30 17:13:14 25 4
gpt4 key购买 nike

我用 C 语言编写了一个 gem,它似乎在运行之间保留了被污染的内存。

我过去注意到了这一点,但最终发现了如何通过使用 Spring 调用 RSpec 中的 Gem 来一致地重现它。重新启动 Spring 后运行此单个 RSpec 示例时,该示例始终会通过。但后续运行时不重新启动 Spring 会导致垃圾数据。进一步的后续运行会产生相同垃圾数据。

示例:

$ spring stop
Spring stopped.
$ spring rspec ..._spec.rb:122
...
1 example, 0 failures

$ spring rspec ..._spec.rb:122
...
Failures:
...
expected collection contained: [7]
actual collection contained: [1333155159]
$ spring rspec ..._spec.rb:122
...
Failures:
...
expected collection contained: [7]
actual collection contained: [1333155159]

$ spring stop
Spring stopped.
$ spring rspec ..._spec.rb:122
...
1 example, 0 failures

$ spring rspec ..._spec.rb:122
...
Failures:
...
expected collection contained: [7]
actual collection contained: [117372691]
$ spring rspec ..._spec.rb:122
...
Failures:
...
expected collection contained: [7]
actual collection contained: [117372691]

C 不应在运行之间保留任何内容。唯一的全局声明是常量、结构定义、函数和模块名称本身。例如(简化为每种类型的声明中只有一个, header 除外):

#include <ruby.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

#define SOME_CONSTANTS 100

struct some_structs {
long id;
double amount;
};

static long some_functions();

VALUE MyModuleName = Qnil;
VALUE internal_function_name(VALUE self, VALUE rb_data, VALUE rb_options);

void Init_my_gem() {
MyModuleName = rb_define_module("MyModuleName");
rb_define_singleton_method(MyModuleName, "exposed_function_name",
internal_function_name, 2);
}

感谢您对正在发生的事情提出的任何想法。

编辑

我将其与此隔离:

printf("A orders[0].products[0]->id: %lu\n", orders[0].products[0]->id);
VALUE rb_best_orders = rb_ary_new();
printf("B orders[0].products[0]->id: %lu\n", orders[0].products[0]->id);

Output:
A orders[0].products[0]->id: 7
B orders[0].products[0]->id: 140735021913496

请注意,orders 被定义为 struct order *orders;,并且它的内存是通过 malloc 获取的。

最佳答案

通过使用ALLOC_N而不是malloc修复。 http://clalance.blogspot.com/2011/01/writing-ruby-extensions-in-c-part-12.html很有帮助,尽管它说 malloc 应该可以工作。

关于c - Ruby C gem 运行之间的内存污染,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30946636/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com