关于micropython的字符串在c语言模块内的引用问题

我在学写micopython的c语言模块时 ,想把python函数传来的字符串的数据存在c语言的的结构体里面。查API得知mp_obj_str_get_data函数能提取字符串数据,就像下面这样:

    const char *p2 = mp_obj_str_get_data((mp_obj_t)(vals[ARG_mqtt_user].u_obj), &len);
    printf("user=%s\n", p2);
    self->p_user = (char *)p2;
    return self;

mp_obj_str_get_data函数是把mp_obj_t类型参数当作python字符串处理,然后返回python字符串的数据的指针和字符串长度。

但问题是返回的指针实际指向micropython的运行时下的全局变量内的MP_STATE_VM(last_pool)内的位置,就是引用了全局字符串池内的地址,而这个应该是受micropython垃圾回收器控制。
虽然上面的c代码可以运行,返回的self内p_user指针指向的字符串也是对的,但这应该只是因为垃圾回收器没回收对应的字符串的内存,如果回收了,p_user就变成野指针了。
考虑到python采用引用计数,而上面的c代码中没声明自己引用了字符串,我也暂时没找到让gc知道有c模块引用了python字符串的api,所以这里该如何处理呢? 自己单独malloc和free?