Skip to content

Commit 202a5ed

Browse files
committed
removed malloc and free
1 parent a0db924 commit 202a5ed

File tree

1 file changed

+38
-168
lines changed

1 file changed

+38
-168
lines changed

src/kdtree.cpp

Lines changed: 38 additions & 168 deletions
Original file line numberDiff line numberDiff line change
@@ -30,24 +30,8 @@ OF SUCH DAMAGE.
3030
#include <stdlib.h>
3131
#include <string.h>
3232
#include <math.h>
33-
#include "kdtree.h"
34-
35-
#if defined(WIN32) || defined(__WIN32__)
36-
#include <malloc.h>
37-
#endif
38-
39-
#ifdef USE_LIST_NODE_ALLOCATOR
40-
41-
#ifndef NO_PTHREADS
4233
#include <pthread.h>
43-
#else
44-
45-
#ifndef I_WANT_THREAD_BUGS
46-
#error "You are compiling with the fast list node allocator, with pthreads disabled! This WILL break if used from multiple threads."
47-
#endif /* I want thread bugs */
48-
49-
#endif /* pthread support */
50-
#endif /* use list node allocator */
34+
#include "kdtree.h"
5135

5236
struct kdhyperrect {
5337
int dim;
@@ -95,21 +79,11 @@ static struct kdhyperrect* hyperrect_duplicate(const struct kdhyperrect *rect);
9579
static void hyperrect_extend(struct kdhyperrect *rect, const double *pos);
9680
static double hyperrect_dist_sq(struct kdhyperrect *rect, const double *pos);
9781

98-
#ifdef USE_LIST_NODE_ALLOCATOR
99-
static struct res_node *alloc_resnode(void);
100-
static void free_resnode(struct res_node*);
101-
#else
102-
#define alloc_resnode() malloc(sizeof(struct res_node))
103-
#define free_resnode(n) free(n)
104-
#endif
105-
106-
107-
10882
struct kdtree *kd_create(int k)
10983
{
11084
struct kdtree *tree;
11185

112-
if(!(tree = static_cast<kdtree*>(malloc(sizeof *tree)))) {
86+
if(!(tree = new kdtree)) {
11387
return 0;
11488
}
11589

@@ -125,7 +99,7 @@ void kd_free(struct kdtree *tree)
12599
{
126100
if(tree) {
127101
kd_clear(tree);
128-
free(tree);
102+
delete tree;
129103
}
130104
}
131105

@@ -139,8 +113,8 @@ static void clear_rec(struct kdnode *node, void (*destr)(void*))
139113
if(destr) {
140114
destr(node->data);
141115
}
142-
free(node->pos);
143-
free(node);
116+
delete[] node->pos;
117+
delete node;
144118
}
145119

146120
void kd_clear(struct kdtree *tree)
@@ -166,11 +140,11 @@ static int insert_rec(struct kdnode **nptr, const double *pos, void *data, int d
166140
struct kdnode *node;
167141

168142
if(!*nptr) {
169-
if(!(node = static_cast<kdnode*>(malloc(sizeof *node)))) {
143+
if(!(node = new kdnode)) {
170144
return -1;
171145
}
172-
if(!(node->pos = static_cast<double*>(malloc(dim * sizeof *node->pos)))) {
173-
free(node);
146+
if(!(node->pos = new double[dim])) {
147+
delete[] node;
174148
return -1;
175149
}
176150
memcpy(node->pos, pos, dim * sizeof *node->pos);
@@ -211,12 +185,7 @@ int kd_insertf(struct kdtree *tree, const float *pos, void *data)
211185
int res, dim = tree->dim;
212186

213187
if(dim > 16) {
214-
#ifndef NO_ALLOCA
215-
if(dim <= 256)
216-
bptr = buf = static_cast<double*>(alloca(dim * sizeof *bptr));
217-
else
218-
#endif
219-
if(!(bptr = buf = static_cast<double*>(malloc(dim * sizeof *bptr)))) {
188+
if(!(bptr = buf = new double[dim])) {
220189
return -1;
221190
}
222191
} else {
@@ -228,12 +197,8 @@ int kd_insertf(struct kdtree *tree, const float *pos, void *data)
228197
}
229198

230199
res = kd_insert(tree, buf, data);
231-
#ifndef NO_ALLOCA
232-
if(tree->dim > 256)
233-
#else
234-
if(tree->dim > 16)
235-
#endif
236-
free(buf);
200+
201+
if (tree->dim > 16) delete[] buf;
237202
return res;
238203
}
239204

@@ -409,11 +374,11 @@ struct kdres *kd_nearest(struct kdtree *kd, const double *pos)
409374
if (!kd->rect) return 0;
410375

411376
/* Allocate result set */
412-
if(!(rset = static_cast<kdres*>(malloc(sizeof *rset)))) {
377+
if(!(rset = new kdres)) {
413378
return 0;
414379
}
415-
if(!(rset->rlist = static_cast<res_node*>(alloc_resnode()))) {
416-
free(rset);
380+
if(!(rset->rlist = new res_node)) {
381+
delete rset;
417382
return 0;
418383
}
419384
rset->rlist->next = 0;
@@ -460,14 +425,9 @@ struct kdres *kd_nearestf(struct kdtree *tree, const float *pos)
460425
struct kdres *res;
461426

462427
if(dim > 16) {
463-
#ifndef NO_ALLOCA
464-
if(dim <= 256)
465-
bptr = buf = static_cast<double*>(alloca(dim * sizeof *bptr));
466-
else
467-
#endif
468-
if(!(bptr = buf = static_cast<double*>(malloc(dim * sizeof *bptr)))) {
469-
return 0;
470-
}
428+
if(!(bptr = buf = new double[dim])) {
429+
return 0;
430+
}
471431
} else {
472432
bptr = sbuf;
473433
}
@@ -477,12 +437,7 @@ struct kdres *kd_nearestf(struct kdtree *tree, const float *pos)
477437
}
478438

479439
res = kd_nearest(tree, buf);
480-
#ifndef NO_ALLOCA
481-
if(tree->dim > 256)
482-
#else
483-
if(tree->dim > 16)
484-
#endif
485-
free(buf);
440+
if(tree->dim > 16) delete[] buf;
486441
return res;
487442
}
488443

@@ -504,42 +459,16 @@ struct kdres *kd_nearest3f(struct kdtree *tree, float x, float y, float z)
504459
return kd_nearest(tree, pos);
505460
}
506461

507-
/* ---- nearest N search ---- */
508-
/*
509-
static kdres *kd_nearest_n(struct kdtree *kd, const double *pos, int num)
510-
{
511-
int ret;
512-
struct kdres *rset;
513-
514-
if(!(rset = malloc(sizeof *rset))) {
515-
return 0;
516-
}
517-
if(!(rset->rlist = alloc_resnode())) {
518-
free(rset);
519-
return 0;
520-
}
521-
rset->rlist->next = 0;
522-
rset->tree = kd;
523-
524-
if((ret = find_nearest_n(kd->root, pos, range, num, rset->rlist, kd->dim)) == -1) {
525-
kd_res_free(rset);
526-
return 0;
527-
}
528-
rset->size = ret;
529-
kd_res_rewind(rset);
530-
return rset;
531-
}*/
532-
533462
struct kdres *kd_nearest_range(struct kdtree *kd, const double *pos, double range)
534463
{
535464
int ret;
536465
struct kdres *rset;
537466

538-
if(!(rset = static_cast<kdres*>(malloc(sizeof *rset)))) {
467+
if(!(rset = new kdres)) {
539468
return 0;
540469
}
541-
if(!(rset->rlist = static_cast<res_node*>(alloc_resnode()))) {
542-
free(rset);
470+
if(!(rset->rlist = new res_node)) {
471+
delete rset;
543472
return 0;
544473
}
545474
rset->rlist->next = 0;
@@ -562,14 +491,9 @@ struct kdres *kd_nearest_rangef(struct kdtree *kd, const float *pos, float range
562491
struct kdres *res;
563492

564493
if(dim > 16) {
565-
#ifndef NO_ALLOCA
566-
if(dim <= 256)
567-
bptr = buf = static_cast<double*>(alloca(dim * sizeof *bptr));
568-
else
569-
#endif
570-
if(!(bptr = buf = static_cast<double*>(malloc(dim * sizeof *bptr)))) {
571-
return 0;
572-
}
494+
if(!(bptr = buf = new double[dim])) {
495+
return 0;
496+
}
573497
} else {
574498
bptr = sbuf;
575499
}
@@ -579,12 +503,7 @@ struct kdres *kd_nearest_rangef(struct kdtree *kd, const float *pos, float range
579503
}
580504

581505
res = kd_nearest_range(kd, buf, range);
582-
#ifndef NO_ALLOCA
583-
if(kd->dim > 256)
584-
#else
585-
if(kd->dim > 16)
586-
#endif
587-
free(buf);
506+
if(kd->dim > 16) delete[] buf;
588507
return res;
589508
}
590509

@@ -609,8 +528,8 @@ struct kdres *kd_nearest_range3f(struct kdtree *tree, float x, float y, float z,
609528
void kd_res_free(struct kdres *rset)
610529
{
611530
clear_results(rset);
612-
free_resnode(rset->rlist);
613-
free(rset);
531+
delete rset->rlist;
532+
delete rset;
614533
}
615534

616535
int kd_res_size(struct kdres *set)
@@ -690,18 +609,18 @@ static struct kdhyperrect* hyperrect_create(int dim, const double *min, const do
690609
size_t size = dim * sizeof(double);
691610
struct kdhyperrect* rect = 0;
692611

693-
if (!(rect = static_cast<kdhyperrect*>(malloc(sizeof(struct kdhyperrect))))) {
612+
if (!(rect = new kdhyperrect)) {
694613
return 0;
695614
}
696615

697616
rect->dim = dim;
698-
if (!(rect->min = static_cast<double*>(malloc(size)))) {
699-
free(rect);
617+
if (!(rect->min = new double[size])) {
618+
delete rect;
700619
return 0;
701620
}
702-
if (!(rect->max = static_cast<double*>(malloc(size)))) {
703-
free(rect->min);
704-
free(rect);
621+
if (!(rect->max = new double[size])) {
622+
delete[] rect->min;
623+
delete rect;
705624
return 0;
706625
}
707626
memcpy(rect->min, min, size);
@@ -712,9 +631,9 @@ static struct kdhyperrect* hyperrect_create(int dim, const double *min, const do
712631

713632
static void hyperrect_free(struct kdhyperrect *rect)
714633
{
715-
free(rect->min);
716-
free(rect->max);
717-
free(rect);
634+
delete[] rect->min;
635+
delete[] rect->max;
636+
delete rect;
718637
}
719638

720639
static struct kdhyperrect* hyperrect_duplicate(const struct kdhyperrect *rect)
@@ -752,62 +671,13 @@ static double hyperrect_dist_sq(struct kdhyperrect *rect, const double *pos)
752671
return result;
753672
}
754673

755-
/* ---- static helpers ---- */
756-
757-
#ifdef USE_LIST_NODE_ALLOCATOR
758-
/* special list node allocators. */
759-
static struct res_node *free_nodes;
760-
761-
#ifndef NO_PTHREADS
762-
static pthread_mutex_t alloc_mutex = PTHREAD_MUTEX_INITIALIZER;
763-
#endif
764-
765-
static struct res_node *alloc_resnode(void)
766-
{
767-
struct res_node *node;
768-
769-
#ifndef NO_PTHREADS
770-
pthread_mutex_lock(&alloc_mutex);
771-
#endif
772-
773-
if(!free_nodes) {
774-
node = malloc(sizeof *node);
775-
} else {
776-
node = free_nodes;
777-
free_nodes = free_nodes->next;
778-
node->next = 0;
779-
}
780-
781-
#ifndef NO_PTHREADS
782-
pthread_mutex_unlock(&alloc_mutex);
783-
#endif
784-
785-
return node;
786-
}
787-
788-
static void free_resnode(struct res_node *node)
789-
{
790-
#ifndef NO_PTHREADS
791-
pthread_mutex_lock(&alloc_mutex);
792-
#endif
793-
794-
node->next = free_nodes;
795-
free_nodes = node;
796-
797-
#ifndef NO_PTHREADS
798-
pthread_mutex_unlock(&alloc_mutex);
799-
#endif
800-
}
801-
#endif /* list node allocator or not */
802-
803-
804674
/* inserts the item. if dist_sq is >= 0, then do an ordered insert */
805675
/* TODO make the ordering code use heapsort */
806676
static int rlist_insert(struct res_node *list, struct kdnode *item, double dist_sq)
807677
{
808678
struct res_node *rnode;
809679

810-
if(!(rnode = static_cast<res_node*>(alloc_resnode()))) {
680+
if(!(rnode = new res_node)) {
811681
return -1;
812682
}
813683
rnode->item = item;
@@ -830,7 +700,7 @@ static void clear_results(struct kdres *rset)
830700
while(node) {
831701
tmp = node;
832702
node = node->next;
833-
free_resnode(tmp);
703+
delete tmp;
834704
}
835705

836706
rset->rlist->next = 0;

0 commit comments

Comments
 (0)