我制作了一个可爱的通用(即模板)List类来处理C++中的列表.原因是我发现这个std::list类在日常使用中非常难看,而且由于我经常使用列表,我需要一个新的.主要的改进是,我的班级,我可以用来[]从中获取物品.此外,还有待实现的是一个IComparer对事物进行排序的系统.
我正在使用这个List类OBJLoader,我的类加载Wavefront .obj文件并将它们转换为网格.OBJLoader包含指向以下"类型"的指针列表:3D位置,3D法线,uv纹理坐标,顶点,面和网格.顶点列表具有必须链接到所有3D位置,3D法线和uv纹理坐标列表中的某些对象的对象.面链接到顶点,网格链接到面.所以他们都是相互联系的.
为简单起见,让我们考虑一下,在某些情况下,只有两个指针列表:List<Person*>和List<Place*>.Personclass包含,其中包括字段List<Place*> placesVisited和Place类包含字段List<Person*> peopleThatVisited.所以我们有结构:
class Person
{
...
public:
Place* placeVisited;
...
};
class Place
{
...
public:
List<People*> peopleThatVisited;
};
Run Code Online (Sandbox Code Playgroud)
现在我们有以下代码:
Person* psn1 = new Person();
Person* psn2 = new Person();
Place* plc1 = new Place();
Place* plc2 = new Place();
Place* plc2 = new Place();
// make some links between …Run Code Online (Sandbox Code Playgroud) c++ pointers list dynamic-memory-allocation dangling-pointer
C++代码:
unique_ptr<int> a = make_unique<int>(159);
auto var = a.get(); // Edited a => a.get() sorry
a.release();
std::cout<<*var<<std::endl; // prints "159"
Run Code Online (Sandbox Code Playgroud)
var在这段代码之后是悬空指针吗?
我写了一个方法来释放我的结构.现在我有一个问题.当我两次调用此方法时,它会给我一个错误.但我确实检查我的结构中是否有某些东西,所以我不知道它是如何可能给我错误的.
我的结构:
typedef struct {
int num_rows;
int num_cols;
int** data;
} matrix;
Run Code Online (Sandbox Code Playgroud)
我的免费方法:
void free_matrix(matrix* m){
int i;
for(i=0;i<m->num_rows;i++){
if(m->data[i]!=NULL){
free(m->data[i]);
}
}
if(m->data!=NULL){
free(m->data);
}
}
Run Code Online (Sandbox Code Playgroud)
额外方法:
void fill_matrix_a(matrix* m){
m->data[0][0] = 1;
m->data[0][1] = 0;
m->data[0][2] = 2;
m->data[1][0] = 0;
m->data[1][1] = 3;
m->data[1][2] = 1;
}
void fill_matrix_b(matrix* m){
m->data[0][0] = 0;
m->data[0][1] = 3;
m->data[1][0] = 2;
m->data[1][1] = 1;
m->data[2][0] = 0;
m->data[2][1] = 4;
}
void init_matrix(matrix* m, int num_rows, int num_cols){ …Run Code Online (Sandbox Code Playgroud) 在 C++ 中,我可以创建一个只能动态分配的结构吗?我想强制执行一种方法来确保程序员不能静态分配这个结构,因为这样做会导致悬空指针,因为我需要在其范围之外使用指针的内容。
代码 1:
int *g(){
int *p;
p=(int *)malloc(sizeof(int));
*p=10;
return p;
}
Run Code Online (Sandbox Code Playgroud)
代码 2:
int *g(){
int p=10;
return &p;
}
Run Code Online (Sandbox Code Playgroud)
输出:
代码 2 ----> [警告] 函数返回局部变量的地址 [-Wreturn-local-addr] 仍然给出正确的输出(10)
代码 1 ----> 工作正常。没有警告,没有错误。
我有很多问题。
代码 1 也返回了一个局部变量的地址,那么为什么没有警告呢?
代码 2 给出了警告,我明白,我正在返回一个局部变量的地址。当函数 g 执行完成时,栈记录被弹出,因此存在悬空指针的情况。尽管如此,当我运行它时,为什么它会给出正确的输出(10)?
代码 1 没有警告,没有错误。但这是一个好习惯吗?
PS 两种场景的主要功能相同。
int main()
{
int *v=g();
printf("%d",*v);
return 1;
}
Run Code Online (Sandbox Code Playgroud)