Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C+中的Realloc指针+;这就是C中的malloced()_C++_C_Malloc_Interop_Realloc - Fatal编程技术网

C++ C+中的Realloc指针+;这就是C中的malloced()

C++ C+中的Realloc指针+;这就是C中的malloced(),c++,c,malloc,interop,realloc,C++,C,Malloc,Interop,Realloc,我正在用C++编写一个库,它应该与其他Ccode/库进行互操作 如果客户端将C中的malloc()'d数组传递到库函数中,那么C++函数能否安全地调用该内存块上的realloc(),并将其返回(将其留给C调用方调用free()它 或者C++是否使用了与C不同的实现和簿记,并且它们是不兼容的 下面是一些示例代码: C代码: c_头.h: struct my_list { int count; int capacity; long* array; }; c_代码。c: #include

我正在用
C++
编写一个库,它应该与其他
C
code/库进行互操作

如果客户端将
C
中的
malloc()
'd数组传递到库函数中,那么
C++
函数能否安全地调用该内存块上的
realloc()
,并将其返回(将其留给
C
调用方调用
free()

或者
C++
是否使用了与
C
不同的实现和簿记,并且它们是不兼容的

下面是一些示例代码:

C代码: c_头.h:

struct my_list {
  int count;
  int capacity;
  long* array;
};
c_代码。c:

#include "c_header.h"
#include "ccp_header.h"

int some_method() {
  struct my_list list1;
  list1.count = 0;
  list1.array = malloc(sizeof(long)*5);
  list1.capacity = 5;
  int ret = cpp_extend_list(&list1) // todo: error checking etc...
  free(list1.array);
}
C++代码:
库函数必须始终返回相同或新的指针,但在C语言中并不总是安全的,因为数据结构中的内部指针引用可能会无效。调用者必须检测内存位置的更改并更改所有内部引用。太可怕了。尤其是在new位置和一个单独的对象(现在不存在)未定义。@WeatherVane函数实际上获取一个指向包含数组指针的结构的指针。结构地址没有更改,所有对数组的访问都是通过包含的结构完成的,因此前面应该没有问题。在这种情况下,请发布有问题的特定代码,否则只能回答通常。请注意,
realloc
可以更改地址,这是无法预测的。@WeatherVane当然
realloc
可以更改地址。但是调用者并不在意,因为它总是通过容器指针访问数组(在
realloc
之后会更新)。我将尝试发布一个示例。这是一个错误,因为
realloc
没有考虑
sizeof(long)
。它应该是
realloc(list->array,(list->capacity+10)*sizeof(long))
。这就是您认为它不安全的原因吗?库函数必须始终返回相同或新的指针,但在C语言中并不总是安全的,因为数据结构中的内部指针引用可能会无效。调用者必须检测内存位置的更改并更改所有内部引用。可怕的。Espe特别是由于新位置和单独对象之间的指针算法(现在不存在)未定义。@WeatherVane函数实际上获取一个指向包含数组指针的结构的指针。结构地址没有更改,所有对数组的访问都是通过包含的结构完成的,因此前面应该没有问题。在这种情况下,请发布有问题的特定代码,否则只能回答通常。请注意,
realloc
可以更改地址,这是无法预测的。@WeatherVane当然
realloc
可以更改地址。但是调用者并不在意,因为它总是通过容器指针访问数组(在
realloc
之后会更新)。我将尝试发布一个示例。这是一个错误,因为
realloc
没有考虑
sizeof(long)
。它应该是
realloc(list->array,(list->capacity+10)*sizeof(long))
。这就是您认为它不安全的原因吗?
#include "c_header.h"

int cpp_extend_list(struct my_list *list) {
  long* temp = realloc(list->array, sizeof(long) * (list->capacity + 10));
  if (!temp) return -1;
  list->array = temp;
  list->capacity+=10;
  return 0;
}