小编Ash*_*ish的帖子

为什么我们不能使用友元函数重载"="?

为什么不允许使用友元函数重载"="?我写了一个小程序,但它给出了错误.

class comp
{
int real;
int imaginary;
public:
comp(){real=0; imaginary=0;}
void show(){cout << "Real="<<real<<" Imaginary="<<imaginary<<endl;}
void set(int i,int j){real=i;imaginary=j;}
friend comp operator=(comp &op1,const comp &op2);
};

comp operator=(comp &op1,const comp &op2)
{
op1.imaginary=op2.imaginary;
op1.real=op2.real;
return op1;
}

int main()
{
comp a,b;
a.set(10,20);
b=a;
b.show();
return 0;
}
Run Code Online (Sandbox Code Playgroud)

编译给出以下错误: -

[root@dogmatix stackoverflow]# g++ prog4.cpp 
prog4.cpp:11: error: ‘comp operator=(comp&, const comp&)’ must be a nonstatic member function
prog4.cpp:14: error: ‘comp operator=(comp&, const comp&)’ must be a nonstatic member function
prog4.cpp: …
Run Code Online (Sandbox Code Playgroud)

c++

12
推荐指数
2
解决办法
2万
查看次数

execve()和共享文件描述符

我从execve的手册页的阅读,如果一个进程(A)把execve,已经打开的文件描述符复制到新工艺(B).

这里出现两种可能性: -

1)是否意味着一个新的文件描述符表被用于处理B创建的,则条目被从过程A的较旧的文件描述符表复制

2)或进程B获得A处理文件描述符表作为execve的过程中A之后将不再存在,并且已经打开的文件只能从进程B关闭,如果它得到A处理的文件描述符表

哪一个是正确的?

c operating-system

6
推荐指数
2
解决办法
6518
查看次数

malloc和free调用期间物理页如何分配和释放?

Malloc 从进程的称为堆的虚拟内存区域之一分配内存。堆的初始大小是多少(在执行开始之后和任何 malloc 调用之前)?比如说,如果堆从 X 虚拟地址开始并以 Y 虚拟地址结束,我想知道 X 和 Y 之间的区别。

我已阅读之前提出的重复问题的答案。

malloc() 和 free() 如何工作?

写的答案都是在虚拟地址的上下文中,但我想知道物理页是如何分配的。我不确定,但我认为这个初始大小(XY)在操作系统中不会有相应的页表条目。如果我错了,请纠正我。

现在,假设有一个分配(和使用)10 字节内存的请求,将分配一个新页面。那么,所有进一步的内存请求都会从此页面得到满足,还是每次分配新页面时都会得到满足?谁来决定这个?

当内存被释放(使用 free())时,那么什么时候这个分配的物理页将被释放并标记为可用?据我所知,虚拟地址和物理页不会立即释放,因为释放的内存量可能会非常少。那么什么时候物理地址和虚拟地址对应的关联会终止呢?

如果我的问题听起来很奇怪,我很抱歉。我只是一个新手,试图了解内部原理。

c malloc operating-system linux-kernel

5
推荐指数
1
解决办法
4592
查看次数

两个进程之间共享代码段

假设我们连续运行两个进程:-

$ grep abc abc.txt ==> pid 100
$ grep def def.txt ==> pid 101
Run Code Online (Sandbox Code Playgroud)

我在《Linux 编程入门》一书第 11 章中读到,进程的代码部分将是共享的,因为它是只读的。是这样吗?我认为如果 grep 被编译为共享库,那么代码部分就会被共享。

还有一个问题,如果是共享库,操作系统如何知道该库是否已加载?假设如果两个进程同时调用一个共享库函数,那么两个进程的虚拟地址如何转换为指向RAM中同一位置的物理地址?

linux

3
推荐指数
1
解决办法
1684
查看次数

静态重定位或段的静态重定位是什么意思

elf 格式的可执行文件包含各种段,如代码、数据、bss、堆栈等。如果我们说段 xyz 是静态重定位的,那意味着什么?

elf 格式的二进制文件包含每个段的相对地址。当我们说静态重定位时,是否意味着相对地址实际上是物理地址?

operating-system memory-management relocation

3
推荐指数
1
解决办法
6123
查看次数

引用2 d数组

请看这个代码: -

#include<stdio.h>
int main()
{
int arr[2][2]={1,2,3,4};
printf("%d %u %u",**arr,*arr,arr);
return 0;
}
Run Code Online (Sandbox Code Playgroud)

当我编译并执行这个程序时,我得到了arr和*arr的相同值,它是2 d数组的起始地址.例如: - 1 3214506 3214506

我的问题是为什么解除引用arr(*arr)不会打印存储在arr中包含的地址的值?

c arrays 2d

2
推荐指数
1
解决办法
129
查看次数

char arr [0]的含义

可能重复:
零长度的数组

我见过这种类型的代码: -

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct pkt {
  int pk_type;
  int tag;
  int magic_num;
  char data[0];  <-------- what does this mean ???
}__attribute__((packed));

typedef struct pkt p_t;
int main(void)
{
  p_t *p = (p_t *)calloc(1, sizeof(p_t));
  if(!p) {
    perror("p");
    return -1;
  }
  p->pk_type = 1;
  p->tag = 0xb00bbabe;
  p->magic_num = 0xcafebabe;
  strcpy("hello world", p->data); <-- Seg faults here !!!  

  return 0;

}
Run Code Online (Sandbox Code Playgroud)

我想知道arr [0]的含义.我的意思是在什么情况下我们需要使用arr [0].它有什么用途?

c

1
推荐指数
1
解决办法
6369
查看次数