为什么我在声明指针时必须使用free():
int *temp = (int*)malloc(sizeof(int))
*temp = 3;
Run Code Online (Sandbox Code Playgroud)
但不是我这样做的时候:
int temp = 3;
Run Code Online (Sandbox Code Playgroud) int A[10000000]; //This gives a segmentation fault
int *A = (int*)malloc(10000000*sizeof(int));//goes without any set fault.
Run Code Online (Sandbox Code Playgroud)
现在我的问题是,出于好奇,如果最终我们能够为我们的数据结构分配更高的空间,例如,在C中使用指针方法创建的BST和链接列表没有这样的内存限制(除非总数大小超过我们机器的RAM大小),例如,在声明指针类型的上面的第二个语句中,为什么我们不能声明一个更大的数组(直到达到内存限制!!). ..这是因为分配的空间在静态大小的数组中是连续的吗?但是从那里我们得到保证,在RAM的下一个1000000字中没有其他代码将运行...?
PS:我在一些陈述中可能错了.在这种情况下请正确.
我想获得一个轻便的便携式光纤库,它具有MIT许可证(或更宽松).Boost.Coroutine不符合(不轻量级),也没有Portable Coroutine Library和Kent C++ CSP(都是GPL).
编辑:你能帮我找一个吗?:)
可能重复:
free和malloc如何在C中工作?
考虑一种情况,我必须通过malloc分配大约20个字节的内存.对于malloc()的函数调用是否成功,20个字节是否应该在内存中连续可用或者是否可以分散?例如,在上面的例子中,如果有4个或5个块,每个10个字节,malloc会工作吗?或者这是特定于操作系统还是特定于编译器?
#include <iostream>
struct person_t{
int age;
};
person_t get_person1(){
person_t person;
person.age = 10;
return person;
}
person_t * get_person2(){
person_t *person = new person_t;
person->age = 20;
return person;
}
int main(){
person_t person1 = get_person1();
person_t *person2 = get_person2();
std::cout << person1.age << std::endl;
std::cout << person2->age << std::endl;
delete person2;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我想知道从函数返回结构的最安全的方法是什么.
正如在这里和这里的问题的答案中所说,当你创建一个对象时get_person1(),该对象将在它超出范围之后被销毁.
但是当我搜索"如何从函数c ++返回一个结构"时,它建议我使用方法一(带有get_person1())(这里的例子).但我认为该方法会在调用函数后销毁对象,我认为方法2是最安全的.
我错了吗?或者关于这个话题的任何意见..?
谢谢!!
在C++中,假设没有优化,那么以下两个程序最终会使用相同的内存分配机器代码吗?
int main()
{
int i;
int *p;
}
int main()
{
int *p = new int;
delete p;
}
Run Code Online (Sandbox Code Playgroud) char * myFunction () {
char sub_str[10][20];
return sub_str;
}
void main () {
char *str;
str = myFunction();
}
Run Code Online (Sandbox Code Playgroud)
错误:从不兼容的指针类型返回
谢谢
即使通过普通的按值调用参数传递机制将对象传递给函数,理论上它们可以保护和隔离调用参数,但是仍然可能发生可能影响甚至损坏的副作用,用作参数的对象.例如,如果用作参数的对象分配内存并在销毁时释放该内存,那么在调用析构函数时,函数内部的本地副本将释放相同的内存.这将使原始物体损坏并且实际上无用.
这是用C++编写的:完整参考
在这个程序在这里
#include<iostream>
using namespace std;
class Sample
{
public:
int *ptr;
Sample(int i)
{
ptr = new int(i);
}
~Sample()
{
cout<<"destroyed";
delete ptr;
}
void PrintVal()
{
cout << "The value is " << *ptr;
}
};
void SomeFunc(Sample x)
{
cout << "Say i am in someFunc " << endl;
}
int main()
{
Sample s1= 10;
SomeFunc(s1);
s1.PrintVal();
}
Run Code Online (Sandbox Code Playgroud)
它会在对象s1从对象返回时被销毁时生成运行时错误.我无法弄清楚为什么会发生这种情况,因为应该制作副本.我想也许是因为班级定义中没有复制构造函数.但我很惊讶地发现,如果使用这个函数声明
void SomeFunc(Sample &x)
{
cout << "Say i am in someFunc " << endl;
} …Run Code Online (Sandbox Code Playgroud) 我可以获取堆结尾的地址sbrk(0),但有没有办法以编程方式获取堆的起始地址,而不是通过解析内容/proc/self/maps?
以下简短但完整的示例程序
const long iterations = 1000000000;
T[] array = new T[1 << 20];
for (int i = 0; i < array.Length; i++)
{
array[i] = new T();
}
Stopwatch sw = Stopwatch.StartNew();
for (int i = 0; i < iterations; i++)
{
array[i % array.Length].Value0 = i;
}
Console.WriteLine("{0,-15} {1} {2:n0} iterations/s",
typeof(T).Name, sw.Elapsed, iterations * 1000d / sw.ElapsedMilliseconds);
Run Code Online (Sandbox Code Playgroud)
与T替换如下类型的
class SimpleClass struct SimpleStruct
{ {
public int Value0; public int Value0;
} }
class ComplexClass struct ComplexStruct …Run Code Online (Sandbox Code Playgroud)