我需要实现一个函数HEAP-DELETE-MIN(Array)来删除最大堆中的最小整数.我不是要求功能本身,但有人可以为我提供一些 伪代码来帮助我开始吗?这将是一个很大的帮助.该数组应该在函数末尾保持最大堆.
我正在尝试PipedInputStream并且PipedOutputStream无法理解为什么以下代码会导致Java堆耗尽问题.String创建的所有临时对象都应该是gc -ed.为什么我会得到一个OutOfMemoryError?
我试图写String每1000 万个字符长的1000个对象.即使在调用时,下面的代码也会失败一半-Xmx2g.更多的痕迹:
written string #453
read string #453
written string #454
Exception in thread "Thread-0" java.lang.OutOfMemoryError: Java heap space
Run Code Online (Sandbox Code Playgroud)
......揭示了PipedInputStream只有一个String对象"落后"了PipedOutputStream.我不明白为什么垃圾收集无法回收所有必要的堆内存.
import java.io.*;
import java.util.*;
class Worker implements Runnable {
private ObjectOutputStream oos;
private PipedInputStream pis;
public Worker() throws IOException {
this.pis = new PipedInputStream();
this.oos = new ObjectOutputStream(new PipedOutputStream( pis ));
}
@Override
public void run() {
try { …Run Code Online (Sandbox Code Playgroud) 我只看到了这个缺点:你可以得到StackOverflow :)为什么不只使用堆?
在Java,C,C++中,函数的参数在堆栈上传递.函数体内的普通变量是在堆栈中创建的.
据我所知,每个线程的堆栈是有限的,有一些默认值,但相对较低:1-8 Mb.为什么不使用堆而不是堆栈.两者都在内存中,只是操作系统从地址A到B分离是堆,而从C到D是堆栈.
有可变的参数.它说有10个变量,每个变量4个字节.如果您阅读11而不是您可能会读取一些数据"内存"垃圾,也许正是您想要的黑客攻击或者您可能会遇到分段错误...如果操作系统检测到您是坏孩子.:) - 所以安全性不能成为使用Stack的理由.
如果我有2个inputStream对象分别读取/保存4gb和4mb的文件.物体的大小是多少?对象的大小取决于内容吗?
处理大量的Excel文件时,我面临每个宝石错误.
我必须将排序后的数据存储在数据结构中.我想要使用的数据结构是堆或二进制搜索树.但我很困惑哪一个更能满足要求即快速有效的搜索.
- - 更多细节 - -
我正在设计一个从源(比如数据网格)接收数据然后将其存储到数据结构中的应用程序.来自数据GRID站的数据采用排序数字的形式.排序数据可以按升序或降序排列.
现在我必须搜索数据.这个过程应该高效快捷.
我有一个可以是"路由器"或"交换机"的设备.我使用下面的函数,传递一个枚举,返回我的字符串.我的问题是whoami的内存是在堆栈上分配的.当此函数devicetype_string完成时,堆栈将被销毁.当我使用指向堆栈上分配的内存的指针时,这不会导致问题吗?
当前代码有效.我只是想了解为什么它的工作原理.我认为更清洁和可移植的解决方案是malloc内存来保持whoami(以便它进入堆)并且调用函数应该释放该内存.
这是目前的计划:
char *devicetype_string (FwdrType devicetype)
{
char *whoami;
switch (devicetype)
{
case FWDR_TYPE__ROUTER:
whoami = "Router";
break;
case FWDR_TYPE__SWITCH:
whoami = "Switch";
break;
default:
whoami = "Fwder Type UNKNOWN";
}
return whoami;
}
foo()
{
. . .
FwderType abc = FWDR_TYPE__ROUTER;
printf ("%s", devicetype_string(abc));
}
Run Code Online (Sandbox Code Playgroud) 在C#中,可以像下面的示例一样在不使用关键字“ new”的情况下初始化数组:
int[] x = { 10, 20, 30 };
Run Code Online (Sandbox Code Playgroud)
这是否意味着数组将在堆栈上初始化,因为关键字“ new”对于在堆上进行初始化是必需的?
是否有可能在Java中有多个堆?如果有可能那么它会在哪些情况下发生?
我已经读过有两个内存区域,一个堆栈和另一个堆栈.基本数据类型(如int,double,float等)存储在堆栈中,而引用类型存储在堆上.正如我们所知,堆栈是LIFO指首先删除最后推送的元素.现在假设下面的代码
int first = 10;
double second = 20.0;
float third = 3.0F;
Run Code Online (Sandbox Code Playgroud)
因此,first将首先推,然后second再third.所以thirdfloat类型的变量将位于堆栈顶部,但如果我使用以下代码(假设在C#中)
Console.WriteLine(second);
Run Code Online (Sandbox Code Playgroud)
second当变量third位于堆栈顶部时,如何访问变量的值?
我需要对C++内存分配做一些澄清,我只是举个例子
假设我已经创建了一个类A,它包含两个容器:一个hash_map和一个std :: vector,如下所示:
class Example{
// methods to add stuff to containers
//...
std::hash_map<std::string,int> map;
std::vector<std::string> vec;
}
Run Code Online (Sandbox Code Playgroud)
如果我然后使用new运算符在堆上创建示例对象:
Example* ex = new Example();
Run Code Online (Sandbox Code Playgroud)
并为每个容器添加一千个条目,我添加的条目也将位于堆上吗?如果是,那么如果我这样做会有什么不同:
class Example{
// methods to add stuff to containers
//...
std::hash_map<std::string,int>* map;
std::vector<std::string>* vec;
}
Run Code Online (Sandbox Code Playgroud)
然后 Example* ex = new Example();