Pebble在“realloc”上崩溃,但仅在某个函数中崩溃
我在Pebble应用程序中使用自定义向量。 Pebble在调用Pebble在“realloc”上崩溃,但仅在某个函数中崩溃,c,memory-management,realloc,pebble-sdk,C,Memory Management,Realloc,Pebble Sdk,我在Pebble应用程序中使用自定义向量。 Pebble在调用realloc时崩溃 main.c #include <pebble.h> #include "movement.h" static PointArray point_array; int main(void) {; point_array_create(&point_array, 1); GPoint point1 = (GPoint){.x = 1, .y = 1}; GPoint
realloc
时崩溃
main.c
#include <pebble.h>
#include "movement.h"
static PointArray point_array;
int main(void) {;
point_array_create(&point_array, 1);
GPoint point1 = (GPoint){.x = 1, .y = 1};
GPoint point2 = (GPoint){.x = 2, .y = 2};
GPoint point3 = (GPoint){.x = 3, .y = 3};
point_array_push(&point_array, point1);
point_array_push(&point_array, point2);
point_array_push(&point_array, point3);
APP_LOG(APP_LOG_LEVEL_DEBUG, "Done\n");
}
#include "movement.h"
#include "pebble.h"
static void point_array_resize(PointArray *point_array){
point_array->capacity *= 2;
size_t new_size = point_array->capacity * sizeof(GPoint) + sizeof(GPoint);
point_array->points = (GPoint*)realloc(point_array->points, new_size);
}
void point_array_create(PointArray *arr, int capacity) {
arr->points = (GPoint*)malloc(capacity * sizeof(GPoint));
arr->length = 0;
arr->capacity = capacity;
}
void point_array_push(PointArray *point_array, GPoint point) {
APP_LOG(APP_LOG_LEVEL_DEBUG, "pushing");
if (point_array->length > point_array->capacity) {
APP_LOG(APP_LOG_LEVEL_DEBUG, "resizing");
point_array_resize(point_array);
APP_LOG(APP_LOG_LEVEL_DEBUG, "successful resize");
}
point_array->points[point_array->length] = point;
point_array->length++;
APP_LOG(APP_LOG_LEVEL_DEBUG, "+ length");
}
移动.h
#include <pebble.h>
#include <stdlib.h>
#include <math.h>
typedef struct {
GPoint *points;
int length;
int capacity;
} PointArray;
void point_array_create(PointArray *arr, int capacity);
void point_array_push(PointArray *point_array, GPoint point);
void point_array_destroy(PointArray *point_array, GPoint point);
GPoint move(GPoint point, float distance, float degrees);
以下是我尝试过的:
- 代码在GCC和Clang(!)上都运行良好
- 我验证了
和point\u array
不为空且point\u array->points
大于new\u size
的现有大小point\u array->points
- 我看了一下,这似乎不适用
- 我尝试调用
底部的point\u array\u create
,效果很好。它只是在realloc
中不起作用点数组\u resize
点阵列推送中,您可以测试是否需要调整顶部点的大小,但测试错误。仅当长度超过容量时才调整大小,这意味着您已经超出了阵列的容量
相反,检查长度是否已达到容量
if (point_array->length == point_array->capacity) {
APP_LOG(APP_LOG_LEVEL_DEBUG, "resizing");
point_array_resize(point_array);
APP_LOG(APP_LOG_LEVEL_DEBUG, "successful resize");
}
如果初始容量为0
,则调整大小代码不起作用。调整大小时应确保容量不为零。@chqrlie good point-容量不为零,并且point\u array->points
中包含内容。例如point\u array->points[0].x==10
程序的其他部分可能存在隐藏内存冲突。如果您的程序或程序的一部分在x86 linux上运行,请尝试valgrind并确保没有看到与您的程序相关的任何错误。为什么要在resize
中重新分配额外的插槽,而不是在create
foo=realloc(foo,一些大小)
总是错误的(除非foo
保证为NULL
,但只需写入NULL
,而不是foo
),因为这可能是内存泄漏<代码>realloc
在出现故障时不会释放
。
if (point_array->length == point_array->capacity) {
APP_LOG(APP_LOG_LEVEL_DEBUG, "resizing");
point_array_resize(point_array);
APP_LOG(APP_LOG_LEVEL_DEBUG, "successful resize");
}