我想使用一个相当于ConcurrentMap(我想要相当于putIfAbsent方法)的地图,但这不会强迫我事先创建对象.
例如,当我这样做时:
m.putIfAbsent( key, new CyclingArray() );
Run Code Online (Sandbox Code Playgroud)
我可能最终创建一个新的CyclingArray(无论是什么)对象.
当然,我意识到我可以锁定整个地图,但这将击败整个地图ConcurrentMap.
在概念上可以做以下工作吗?
m.putIfAbsent( key, new Callback<CyclingArray>() {
@Override
public CyclingArray provide() {
return new CyclingArray(); // only called if the key wasn't already present
}
}
Run Code Online (Sandbox Code Playgroud)
你知道任何提供地图的图书馆:
putIfAbsent方法.ConcurrentHashMap实现)请注意,我不是在问上面的例子是否可以使用ConcurrentMap(它不能是AFAIK).
我正在考虑使用回调版本扩展ConcurrentHashMap和重载putIfAbsent,但遗憾的是ConcurrentHashMap内部使用了最终的Segment类.
在重新发明轮子之前,我想知道是否有任何地图已经提供了类似的功能.
将值放入我的数组后,一步之后(感谢gdp)数组包含垃圾.之后的唯一步骤是将参数传递给函数:
struct Vertex;
typedef struct Vertex Vertex;
struct Vertex {
int sides[2][LENGTH];
int ends[2];
Vertex *children;
Vertex *parent;
};
void move(Vertex *node, int side, int place) {
(38) int handfull = (*node).sides[side][place];
.....
}
int blah(Vertex *node, int side) {
.....
(103) *((*node).children + i) = init_child(node);
(104) move((*node).children + i, side, i);
(105) blah((*node).children + i, opposingside);
.....
}
Run Code Online (Sandbox Code Playgroud)
gdb告诉我以下内容:
(gdb) print (*node)
$7 = {sides = {{5, 5}, {0, 5}}, ends = {0, 1},
children = 0x7fffffffdfa0, parent …Run Code Online (Sandbox Code Playgroud) 我多次听说过,如果你没有初始化变量,那么garbage value就存储在变量中.
说
int i;
printf("%d",i);
Run Code Online (Sandbox Code Playgroud)
上面的代码打印任何垃圾值,但我想知道如果未初始化,存储垃圾值需要什么?
我的问题是关于调试内存泄漏,这似乎是一场噩梦.
在我的应用程序中有一个简单的类派生自TObject.该类的所有对象都存储在派生自TObjectList以下类的类的集合/列表中:
type
TOffer = class(TObject)
Item: string;
Price: string;
Id: string;
end;
TOffers = class(TObjectList<TOffer>)
protected
procedure SetOffer(I: Integer; AOffer: TOffer);
function GetOffer(I: Integer): TOffer;
public
property Offers[I: Integer]: TOffer read GetOffer write SetOffer
end;
Run Code Online (Sandbox Code Playgroud)
使用场景:
爬虫下载商品,解析商品并保存到对象集合.这种方法似乎很方便,因为我可以稍后引用这些对象(填充网格/列表,将它们写入文件等)
问题是正确处理对象以避免内存泄漏.该应用程序在启动时分配~4Mb内存,但在处理后~12k提供它吞噬32Mb.在过程完成后由未正确处理的对象/变量引起的泄漏.
ReportMemoryLeaksOnShutdown 显示可怕的数字,但关键是 - 我不知道在哪里看,以及如何正确调试该死的东西.
另一个例子是var MyString: string需要适当处置的变量!! 这对我来说很有见地:)我认为每个过程/函数都会自动管理超出范围的变量的垃圾收集.
商品列表由函数创建:
function GetOffersList: TOffers;
begin
Result := TOffers.Create;
while not rs.EOF do
begin
Offer := TOffer.Create;
try
// here come collected offer attributes as variables of …Run Code Online (Sandbox Code Playgroud) 一位采访者问我一个奇怪的问题,我无法找到答案.
是否可以强制对象在Gen 1或Gen 2中而不是在Gen 0中进行垃圾回收?
是否从未引用的对象创建了任何垃圾?
我想到的例子是使用静态工厂方法创建一个对象,然后让该对象执行一个函数,但从不创建对它的引用.
例如:
LoggerFactory.getLogger(Foo.class).info("logging some stuff");
Run Code Online (Sandbox Code Playgroud)
这只是在eden空间中创建一个未引用的对象,一旦下一个集合发生就会被垃圾收集吗?
我想从表中"解开"一个元表,并想知道是否:
tbl = setmetatable(tbl, false) -- or nil
Run Code Online (Sandbox Code Playgroud)
这是正确的方法吗?我找不到任何有关如何正确执行此操作的信息.我需要使用赋值运算符吗?
另外,如果metatable从未有过引用并且是匿名的话,这是否足以破坏附加到表的元表?:
tbl = setmetatable({}, {__index = something})
-- later on:
tbl = nil
Run Code Online (Sandbox Code Playgroud)
垃圾收集器就足以删除两个表?
我有一个奇怪的问题,我不确定我是否能够解释它,但我们开始吧。在学习 C 并使用它时,您通常会遇到术语“垃圾”或“垃圾”值,我的第一个问题是,该内存地址中的数据是来自某个不同程序或其他任何东西的数据,还是实际上是一些“随机'值,如果我认为那个内存地址中的剩余值是真的,为什么我们仍然能够从这样的内存地址读取,我的意思是假设我们只是声明了 int x; 现在它存储在某个内存地址的 bss 中,我们要输出它的值,我们将获得驻留在该地址上的值,所以如果我说的所有事情都是真的,
这是源代码
#include <stdio.h>
#include <stdlib.h>
int *fun();
int main()
{
int *j;
j=fun();
printf("%d\n",*j);
printf("%d\n",*j);
return 0;
}
int *fun()
{
int k=35;
return &k;
}
Run Code Online (Sandbox Code Playgroud)
输出 -
35
1637778
Run Code Online (Sandbox Code Playgroud)
第一个printf()打印35,这是k的值
在main()中,第二个printf打印垃圾值而不是打印35.为什么?
在非常频繁调用的方法中不设置新的临时变量会更有效吗?(> 1000x s)
所以目前的例子.我正在分配3个新的整数值,而是将这些值直接传递给另一个方法.
// What I'm currently doing
public virtual byte GetByte(Vector3 worldPos) {
worldPos -= transform.position;
int x = Mathf.FloorToInt(worldPos.x);
int y = Mathf.FloorToInt(worldPos.y);
int z = Mathf.FloorToInt(worldPos.z);
return GetByte(x, y, z);
}
Run Code Online (Sandbox Code Playgroud)
但直接传递这些值会更有效,而不是分配3个新变量吗?
// would this be more efficient?
public virtual byte GetByte(Vector3 worldPos) {
worldPos -= transform.position;
return GetByte(
Mathf.FloorToInt(worldPos.x),
Mathf.FloorToInt(worldPos.y),
Mathf.FloorToInt(worldPos.z));
}
Run Code Online (Sandbox Code Playgroud)