困扰我3天的问题,高手指教一下吧

guanri 2012-04-08 08:45:03
一个静态库,内有函数
struct PCDATA
{
DWORD ID;
char name[20];
char data[250];
}
struct PCDATA * getmem(DWORD id)
{
struct PCDATA * p;
p=(struct PCDATA *)malloc(sizeof(struct PCDATA));
p->ID=id;
return p;
}
ref class A
{
private:
struct PCDATA * d; //标记 这样使用是否正确,是否会出现
public:
A(DWORD Value)
{
d=getmem(Value);
};
}
在主函数中
array<A^>^ arrayA=gcnew array<A^>(999999);
for(int i=0;i<999999;i++)
{
arrayA[i]=(A^)gcnew A(i);
}
问题:
1,这样一运行就出现内存溢出错误,为什么呢
2,当垃圾回收机制运行后,在标记处是指向地址是否会改变,地址内容会被更改么
谢谢,各位高手,请指教一下
...全文
146 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
guanri 2012-04-11
  • 打赏
  • 举报
回复
我没说共享,我说的是在各自的线程内读写他们申请的内存
真相重于对错 2012-04-11
  • 打赏
  • 举报
回复
提问题至少要把问题写清楚,
真相重于对错 2012-04-10
  • 打赏
  • 举报
回复
共享变量要用信号量控制,建议看看msdn关于多线程部分
guanri 2012-04-10
  • 打赏
  • 举报
回复
如果
array<A^>^ arrayA=gcnew array<A^>(999999);
for(int i=0;i<999999;i++)
{
arrayA[i]=(A^)gcnew A(i);
}
代码放到线程中,然后建立100个这样的线程,同时运行会出现读写冲突,应该怎么解决呢
whycom 2012-04-09
  • 打赏
  • 举报
回复
项目设置
也可以用代码
guanri 2012-04-09
  • 打赏
  • 举报
回复
那请问怎么设置堆内存的大小呢,谢谢
真相重于对错 2012-04-09
  • 打赏
  • 举报
回复
溢出,应该是堆内存小了
至于,非托管对象包含在托管类型中 msdn有代码演示

      Visual C++  
如何:包装本机类以供 C# 使用
请参见 示例
语言筛选器: 全部 语言筛选器: 多个 语言筛选器: Visual Basic 语言筛选器: C# 语言筛选器: C++ 语言筛选器: J# 语言筛选器: JScript
Visual Basic(声明)
Visual Basic(用法)
C#
C++
J#
JScript

本示例说明如何包装本机 C++ 类以便用 C# 或其他 .NET 语言编写的代码可以使用它。

示例
复制代码
// wrap_native_class_for_mgd_consumption.cpp
// compile with: /clr /LD
#include <windows.h>
#include <vcclr.h>
#using <System.dll>

using namespace System;

class UnmanagedClass {
public:
LPCWSTR GetPropertyA() { return 0; }
void MethodB( LPCWSTR ) {}
};

public ref class ManagedClass {
public:
// Allocate the native object on the C++ Heap via a constructor
ManagedClass() : m_Impl( new UnmanagedClass ) {}

// Deallocate the native object on a destructor
~ManagedClass() {
delete m_Impl;
}

protected:
// Deallocate the native object on the finalizer just in case no destructor is called
!ManagedClass() {
delete m_Impl;
}

public:
property String ^ get_PropertyA {
String ^ get() {
return gcnew String( m_Impl->GetPropertyA());
}
}

void MethodB( String ^ theString ) {
pin_ptr<const WCHAR> str = PtrToStringChars(theString);
m_Impl->MethodB(str);
}

private:
UnmanagedClass * m_Impl;
};


请参见
参考
使用 C++ Interop(隐式 PInvoke)


要提出有关“帮助”或本产品其他功能的建议或错误报告,请转到反馈站点。
guanri 2012-04-08
  • 打赏
  • 举报
回复
发完贴后发现分给少了,如果有满意答案我在开辟新贴,追加100分。各位高手指教一下

7,540

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 VC.NET
社区管理员
  • VC.NET社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧