漏れたが、私はメモリリークが発生しやすい方法からオブジェクトを返すことを事実であるとこのような議論のリストで参照していますか?オブジェクトのメソッド:たとえば、決してオブジェクトを返さない、よりメモリは私がきちんとC.</p> <p>内のオブジェクトを実装する方法について質問がある
extern void quaternion_get_product(Quaternion * this, Quaternion * q, Quaternion * result);
制御が容易であるので、malloc()
コールのみ、コンストラクタで行われているこの方法です。
私はこの種のカプセル化をC言語にしていないので、これが私の問題を解決する方法であるかどうかはわかりません。私は自分のコードをスケーラブルにしたいだけです。これをやり続けると、メモリリークがまったく起こり、デバッグが非常に難しくなることがわかります。どのように通常接近していますか?私のコードで正しい軌道に乗っていますか?
私の質問は、私が持っている場合は、この、次のとおりです。
Quaternion p = *quaternion_create(1, 0, 0, 0);
Quaternion q = *quaternion_create(1, 0, 1, 0);
Quaternion r = *quaternion_create(1, 1, 1, 0);
Quaternion s = *quaternion_create(1, 1, 1, 1);
p = *quaterion_get_product(&p, &q); // Memory leak, old p memory block is not being pointed by anyone
Quaternion t = *quaternion_get_product(&q, quaternion_get_product(&s, &r));
メモリリークが既存のポインタによる関数呼び出しを入れ子にする場合、中間メモリ・ブロックが指摘されていない存在している、
ヘッダファイルquaternion_destroy呼び出すことはできません:
#ifndef __QUATERNIONS_H_
#define __QUATERNIONS_H_
#include <stdlib.h>
typedef struct Quaternion Quaternion;
struct Quaternion {
float w;
float x;
float y;
float z;
};
extern Quaternion *quaternion_create(float nw, float nx, float ny, float nz);
extern void quaternion_destroy(Quaternion *q);
extern Quaternion *quaternion_get_product(Quaternion *this, Quaternion *q);
extern Quaternion *quaternion_get_conjugate(Quaternion *this);
extern float quaternion_get_magnitude(Quaternion *this);
extern void quaternion_normalize(Quaternion *this);
extern Quaternion *quaternion_get_normalized(Quaternion *this);
#endif
実装ファイル:
#include "quaternion.h"
#include <math.h>
Quaternion *quaternion_create(float nw, float nx, float ny, float nz) {
Quaternion *q = malloc(sizeof(Quaternion));
q->w = nw;
q->x = nx;
q->y = ny;
q->z = nz;
return q;
}
void quaternion_destroy(Quaternion *q) {
free(q);
}
Quaternion *quaternion_get_product(Quaternion *this, Quaternion *p) {
Quaternion *return_q = quaternion_create(
this->w * p->w - this->x * p->x - this->y * p->y - this->z * p->z, // new w
this->w * p->x + this->x * p->w + this->y * p->z - this->z * p->y, // new x
this->w * p->y - this->x * p->z + this->y * p->w + this->z * p->x, // new y
this->w * p->z + this->x * p->y - this->y * p->x + this->z * p->w
);
return return_q;
}
Quaternion *quaternion_get_conjugate(Quaternion *this)
{
return quaternion_create(this->w, -this->x, -this->y, -this->z);
}
float quaternion_get_magnitude(Quaternion *this) {
return sqrt(this->w * this->w + this->x * this->x + this->y * this->y + this->z * this->z);
}
void quaternion_normalize(Quaternion *this) {
float m = quaternion_get_magnitude(this);
this->w /= m;
this->x /= m;
this->y /= m;
this->z /= m;
}
Quaternion *quaternion_get_normalized(Quaternion *this) {
Quaternion *r = quaternion_create(this->w, this->x, this->y, this->z);
quaternion_normalize(r);
return r;
}
あなたがCでオブジェクトをエミュレートしたい理由はありますか? C++は簡単ではありませんか? –
malloc/freeはかなり高価な操作なので、主にパフォーマンスが低いため、malloc/freeを使用しません。 –
ただのコメントです。私はパフォーマンスの影響を受けやすいかもしれない何かで数学をするために四元数を実装していると思う。定数mallocsはあなたのパフォーマンスを絶対に破壊します。メモリリークを回避し、同時にパフォーマンスを破壊しないようにするには、mallocを使用しないでください。すべてのコストをかけてmallocを避け、ユーザーが割り当てと解放を処理できるようにする。 – Art