我正在尝试编写一个使用STL分配器的容器类.我目前所做的是拥有一名私人会员
std::allocator<T> alloc_;
Run Code Online (Sandbox Code Playgroud)
(稍后将模板化以便用户可以选择不同的分配器)然后调用
T* ptr = alloc_.allocate(1,0);
Run Code Online (Sandbox Code Playgroud)
获取指向新分配的'T'对象的指针(并使用alloc_.construct来调用构造函数;请参阅下面的答案).这适用于GNU C++库.
但是,对于Solaris上的STLPort,这无法做正确的事情并导致各种奇怪的内存损坏错误.如果我改为做
std::allocator_interface<std::allocator<T> > alloc_;
Run Code Online (Sandbox Code Playgroud)
然后一切正常.
使用stl :: allocator的正确方法是什么?STLPort/Solaris版本无法使用g ++进行编译,但是g ++是正确的吗?
我有两个变量的函数f(x,y),其中我需要知道它与零交叉的曲线的位置.ContourPlot非常有效地做到了这一点(即:它使用巧妙的多网格方法,而不仅仅是一个强力细粒度扫描),但只是给了我一个情节.我想有一组值{x,y}(具有一些指定的分辨率)或者可能有一些插值函数,它允许我访问这些轮廓的位置.
想过从ContourPlot的FullForm中提取这个,但这似乎有点像黑客.有更好的方法吗?
我在Mathematica中遇到了一个涉及NDSolve的问题,我使用不同的参数值运行多次.对于其中一些值,解决方案会产生奇点,NDSolve会对NDSolve :: ndsz或其他相关警告发出警告.
我只想捕捉这些警告,抑制它们的显示,并且只是跟踪这些特定参数值出现问题的事实.我想到了以下几个选项(两者都没有真正的诀窍):
Check.但是,这仍然会显示警告.如果我把它关掉Off了Check没有报告警告过.EventLocator方法停止NDSolve ,因此我可以检查函数或其派生的非常大的值,并在这种情况下停止评估.但是,在实践中,这仍然会不时产生警告,大概是因为步长有时会非常大,以至于NDSolve警告在我Event发生之前就会触发.还有其他建议吗?
对旧式Makefile非常满意,我正在寻找libtool的简单替代品.我不想切换到automake,当我尝试直接使用它时,我一直遇到libtool的问题.最新的一个是'不支持的硬编码属性',我厌倦了缺乏完整的文档,只是告诉我这次出了什么问题......
我只想用正确的标志编译一堆.o文件,然后将它们链接到一个共享库,这样它就可以在尽可能多的平台上运行.那里有什么可以做到这一点而不是强迫我同时切换我的所有其他工具吗?
我试图使用copyPixelsToBuffer和copyPixelsFromBuffer方法在Android上访问ARGB_8888格式的位图的原始数据.但是,调用这些调用似乎始终将alpha通道应用于rgb通道.我需要byte []或类似的原始数据(通过JNI;是的,我知道Android 2.2中的bitmap.h,不能使用它).
这是一个示例:
// Create 1x1 Bitmap with alpha channel, 8 bits per channel
Bitmap one = Bitmap.createBitmap(1,1,Bitmap.Config.ARGB_8888);
one.setPixel(0,0,0xef234567);
Log.v("?","hasAlpha() = "+Boolean.toString(one.hasAlpha()));
Log.v("?","pixel before = "+Integer.toHexString(one.getPixel(0,0)));
// Copy Bitmap to buffer
byte[] store = new byte[4];
ByteBuffer buffer = ByteBuffer.wrap(store);
one.copyPixelsToBuffer(buffer);
// Change value of the pixel
int value=buffer.getInt(0);
Log.v("?", "value before = "+Integer.toHexString(value));
value = (value >> 8) | 0xffffff00;
buffer.putInt(0, value);
value=buffer.getInt(0);
Log.v("?", "value after = "+Integer.toHexString(value));
// Copy buffer back to Bitmap …Run Code Online (Sandbox Code Playgroud) java-native-interface android bitmap alpha-transparency argb
在Android上,直接ByteBuffer似乎永远不会释放其内存,即使在调用System.gc()时也是如此.
示例:做
Log.v("?", Long.toString(Debug.getNativeHeapAllocatedSize()));
ByteBuffer buffer = allocateDirect(LARGE_NUMBER);
buffer=null;
System.gc();
Log.v("?", Long.toString(Debug.getNativeHeapAllocatedSize()));
Run Code Online (Sandbox Code Playgroud)
在日志中给出两个数字,第二个数字至少比第一个大LARGE_NUMBER.
我如何摆脱这种泄漏?
添加:
按照Gregory的建议来处理C++方面的alloc/free,然后我定义了
JNIEXPORT jobject JNICALL Java_com_foo_bar_allocNative(JNIEnv* env, jlong size)
{
void* buffer = malloc(size);
jobject directBuffer = env->NewDirectByteBuffer(buffer, size);
jobject globalRef = env->NewGlobalRef(directBuffer);
return globalRef;
}
JNIEXPORT void JNICALL Java_com_foo_bar_freeNative(JNIEnv* env, jobject globalRef)
{
void *buffer = env->GetDirectBufferAddress(globalRef);
free(buffer);
env->DeleteGlobalRef(globalRef);
}
Run Code Online (Sandbox Code Playgroud)
然后我在JAVA端获得我的ByteBuffer
ByteBuffer myBuf = allocNative(LARGE_NUMBER);
Run Code Online (Sandbox Code Playgroud)
并释放它
freeNative(myBuf);
Run Code Online (Sandbox Code Playgroud)
不幸的是,虽然它确实分配好了,但它仍然保持根据Debug.getNativeHeapAllocatedSize()和b)分配的内存导致错误
W/dalvikvm(26733): JNI: DeleteGlobalRef(0x462b05a0) failed to find entry (valid=1)
Run Code Online (Sandbox Code Playgroud)
我现在彻底搞糊涂了,我以为我至少理解了C++方面的事情......为什么free()没有返回内存?我做错了DeleteGlobalRef()什么?
我有一个应用程序,我们称之为'com.company.foo',主要活动'FooBar'.在我的AndroidManifest.xml中,我有
<application android:label="@string/app_name"
android:icon="@drawable/icon"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen" >
<activity android:name="FooBar"
android:label="@string/app_name"
android:configChanges="keyboardHidden|orientation" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
...
</application>
Run Code Online (Sandbox Code Playgroud)
(其中的点包含我的应用程序内的其他活动).在这种形式下,它可以很好地满足我的HTC愿望和模拟器.然而,从市场上下载应用程序的(非常)少数人报告崩溃
java.lang.RuntimeException:无法在loader dalvik.system.PathClassLoader [/ mnt]中实例化活动ComponentInfo {com.company.foo/com.company.foo.FooBar}:java.lang.ClassNotFoundException:com.company.foo.FooBar /asec/com.company.foo-1/pkg.apk]
有人建议更换android:name="FooBar"with android:name=".FooBar",这在我的手机和模拟器上再次正常工作,但在其他一些设备上失败了.如果我完全放弃这个属性,它根本不会让我安装.
有任何想法吗?
android classloader classnotfoundexception runtimeexception android-activity
我有一个AsyncTask,我在onPreExecute中显示ProgressDialog,并在onPostExecute中再次隐藏它,类似于
final class UploadTask extends AsyncTask {
ProgressDialog dialog = new ProgressDialog(...);
protected onPreExecute() {
dialog.show();
}
protected onPostExecute() {
dialog.hide();
}
};Run Code Online (Sandbox Code Playgroud)
该对话框是可取消的,当我在执行AsyncTask期间按下取消按钮时,该对话框确实消失了.
当发生这种情况时,我想运行一些代码来取消AsyncTask(现在,即使他认为ProgressDialog消失了,AsyncTask仍在运行并最终完成).我尝试从ProgressDialog派生我自己的类然后做
setOnDismissListener(new OnDismissListener() {
@Override public void onDismiss(DialogInterface d) {
/* do something */
}
};Run Code Online (Sandbox Code Playgroud)
(或类似于OnCancelListener的东西),但这根本不会被调用.
有任何想法吗?我只需要一些机制让用户在显示ProgressDialog时取消正在运行的AsyncTask.
我做了一个INSTALL_FAILED_UPDATE_INCOMPATIBLE错误
adb install MyPackage.apk
Run Code Online (Sandbox Code Playgroud)
我做了所有其他帖子的建议,即卸载包
adb uninstall com.company.package
Run Code Online (Sandbox Code Playgroud)
(对'company'和'package'进行适当的替换),报告'Success',但仍然出现安装错误......
在adb logcat输出中我得到了
No content provider found for permission revoke:
file:///data/local/tmp/MyPackage.apk
Package com.company.package codePath changed from
/data/app/com.company.package-1.apk to
/data/app/com.company.package-2.apk; Retaining data and using new
Package couldn't be installed in /data/app/com.company.package-2.apk
Run Code Online (Sandbox Code Playgroud)
这表明仍然存在先前安装的痕迹,但我无法弄清楚如何摆脱这些痕迹.
有任何想法吗?该设备没有root,我想尽可能保持这种方式.
android ×5
c++ ×2
adb ×1
argb ×1
bitmap ×1
bytebuffer ×1
c ×1
classloader ×1
contour ×1
g++ ×1
installation ×1
libtool ×1
memory-leaks ×1
numerical ×1
permissions ×1
stlport ×1
try-catch ×1
warnings ×1
zero ×1