示例:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;
void right_function();
void wrong_function();
typedef struct Entity {
void *value;
void set_vaue(void *value, size_t size);
} Entity;
int main() {
//请转入下面两个函数中
right_function();
wrong_function();
return 0;
}
void right_function() {
Entity entities[10];
//第一次遍历
for (int i = 0; i < 10; ++i) {
Entity entity = entities[i];
//一系列操作...
}
//第二次遍历
for (int i = 0; i < 10; ++i) {
/**
* 此处会出现内存错误,因为在第一次遍历中已经把所有的value通过析构
* 释放了。
*/
Entity entity = entities[i];
//一系列操作...
}
}
void wrong_function() {
Entity entities[10];
//第一次遍历
for (int i = 0; i < 10; ++i) {
Entity &entity = entities[i];
//一系列操作...
}
//第二次遍历
for (int i = 0; i < 10; ++i) {
/**
* 此处不出现错误,因为使用是引用。
*/
Entity &entity = entities[i];
//一系列操作...
}
}
Entity::~Entity() {
if (NULL != value) {
free(value);
value = NULL;
}
}
void Entity::set_vaue(void *value, size_t size) {
if (NULL != this->value) {
free(this->value);
this->value = NULL;
}
this->value = malloc(size);
memset(this->value, 0, size);
memcpy(this->value, value, size);
}